packrat::init("~/Desktop/Heloderma Spatial/Heloderma Spatial")
library(adehabitatHR) #for home range calculations
library(data.table) #manipulate S3 and S4 data tables
data.table 1.11.8 Latest news: r-datatable.com
Attaching package: ‘data.table’
The following objects are masked from ‘package:dplyr’:
between, first, last
The following object is masked from ‘package:purrr’:
transpose
The following object is masked from ‘package:raster’:
shift
library(ggplot2) #for graphic output
library(ggfortify) #to allow ggplot2 to read spatial data
library(grid) #to add annotations to the output
# library(OpenStreetMap) #for obtaining raster images
library(pbapply) #needed for progress bar
package ‘pbapply’ was built under R version 3.5.2
library(plotly) #for interactive xy plot
Attaching package: ‘plotly’
The following objects are masked from ‘package:plyr’:
arrange, mutate, rename, summarise
The following object is masked from ‘package:ggmap’:
wind
The following object is masked from ‘package:ordinal’:
slice
The following object is masked from ‘package:ggplot2’:
last_plot
The following object is masked from ‘package:MASS’:
select
The following object is masked from ‘package:raster’:
select
The following object is masked from ‘package:stats’:
filter
The following object is masked from ‘package:graphics’:
layout
library(rgdal) #for converting spatial data
package ‘rgdal’ was built under R version 3.5.2rgdal: version: 1.4-3, (SVN revision 828)
Geospatial Data Abstraction Library extensions to R successfully loaded
Loaded GDAL runtime: GDAL 2.1.3, released 2017/20/01
Path to GDAL shared files: /Library/Frameworks/R.framework/Versions/3.5/Resources/library/rgdal/gdal
GDAL binary built with GEOS: FALSE
Loaded PROJ.4 runtime: Rel. 4.9.3, 15 August 2016, [PJ_VERSION: 493]
Path to PROJ.4 shared files: /Library/Frameworks/R.framework/Versions/3.5/Resources/library/rgdal/proj
Linking to sp version: 1.3-1
library(sp) #for converting spatial data
library(rgeos)
rgeos version: 0.4-2, (SVN revision 581)
GEOS runtime version: 3.6.1-CAPI-1.10.1
Linking to sp version: 1.3-1
Polygon checking: TRUE
# library(raster)
library(mapview)
Overall individual yearly home ranges for non/subsidized populations
Gila monster locations for all tracked lizards across Stone Canyon
myMap
768x1280 terrain map image from Stamen Maps.
See ?ggmap to plot it.
OVERALL YEARLY ANALYSES
Plot of 100% MCP HRs against number of relocations
year <- read_csv("GM_Consolidated_ByYear.csv")
Missing column names filled in: 'X13' [13]Parsed with column specification:
cols(
Year = [32mcol_double()[39m,
Gila = [31mcol_character()[39m,
Sex = [31mcol_character()[39m,
Environment = [31mcol_character()[39m,
Home_Range_100mcp = [32mcol_double()[39m,
N100 = [32mcol_double()[39m,
Home_Range_95mcp = [32mcol_double()[39m,
N95 = [32mcol_double()[39m,
Home_Range_95kde = [32mcol_double()[39m,
N = [32mcol_double()[39m,
Home_Range_50kde = [32mcol_double()[39m,
N50 = [32mcol_double()[39m,
X13 = [33mcol_logical()[39m
)
# quick plot
# Graph1<-ggplot(year,aes(x=N100,y=Home_Range_100mcp,group=Environment))+
Graph1<-ggplot(year,aes(x=N100,y=Home_Range_100mcp))+
geom_point(aes(shape = factor(Environment)), size = 4)+
scale_shape_manual(values=c(16, 2))+
geom_smooth(aes(linetype=Environment),colour="black", method="lm") +
# scale_colour_manual(values=c(subsidized="cyan3",nonsubsidized="indian red1"))+
# labs(title = "100% MCP Home Ranges")+
xlab("Number of Relocations")+
ylab("100% MCP Area (ha)")+
# labs(caption = "Figure 3 | Non-Subsidized (Owl Head Buttes) vs. Subsidized (Stone Canyon) population 100% MCPs against number \n of fixes of the complete data set.")+
theme(plot.caption = element_text(hjust = 0,lineheight = 0.9))
# theme_bw()
Graph1<-Graph1+theme(axis.title=element_text(size = 18))
# legend at top-left, inside the plot
SCOH.hr.fig<-Graph1 + theme(legend.title = element_blank(),
legend.text = element_text(size = 14),
legend.justification=c(0,1),
legend.position=c(0.05, 0.95),
legend.background = element_blank(),
legend.key = element_blank(),
legend.box.background = element_rect(colour = "black")) +
scale_shape_discrete(name ="",
breaks=c("nonsubsidized", "subsidized"),
labels=c("Nonsubsidized", "Subsidized")) +
scale_linetype_discrete(name ="",
breaks=c("nonsubsidized", "subsidized"),
labels=c("Nonsubsidized", "Subsidized"))
Scale for 'shape' is already present. Adding another scale for 'shape', which
will replace the existing scale.
SCOH.hr.fig

# dir.create("outputs") # create a new folder to hold the output files
# ggsave("outputs/SC_OHB_plot.pdf")
Plot of 95% KDEs against relocations

Overall combined 100% MCP means averaged across sex
library(Rmisc)
Means <- summarySE(year, measurevar="Home_Range_100mcp",
groupvars=c("Environment"),na.rm = TRUE)
kable(Means, format = "pandoc", caption = 'Overall combined 100% MCP means averaged across sex')
Overall combined 100% MCP means averaged across sex
| nonsubsidized |
26 |
33.44231 |
20.518658 |
4.0240400 |
8.287665 |
| subsidized |
53 |
10.40151 |
6.948743 |
0.9544832 |
1.915311 |
Overall combined 95% MCP means averaged across sex
Means.95mcp <- summarySE(year, measurevar="Home_Range_95mcp",
groupvars=c("Environment"),na.rm = TRUE)
Means.95mcp
Set projection for mapping
CRS.SC<-CRS("+proj=utm +zone=12 +ellps=WGS84 +units=m +no_defs")
Function for MCP analysis
Function of MCP polygons used for mapping
Function of KDE analysis
kde_analysis.href.plot <- function(filename, percentage){
data <- read.csv(file = filename)
x <- as.data.frame(data$EASTING)
y <- as.data.frame(data$NORTHING)
xy <- c(x,y)
data.proj <- SpatialPointsDataFrame(xy,data, proj4string = CRS.SC)
xy <- SpatialPoints(data.proj@coords)
kde<-kernelUD(xy, h="href", kern="bivnorm", grid=1000)
ver <- getverticeshr(kde, percentage)
area <- as.data.frame(round(ver$area,4))
.rowNamesDF(area, make.names=TRUE) <- data$LIZARDNUMBER
write.table(area,file="KDE_Hectares.csv",
append=TRUE,sep=",", col.names=FALSE, row.names=TRUE)
kde.points <- cbind((data.frame(data.proj@coords)),data$LIZARDNUMBER)
colnames(kde.points) <- c("x","y","lizardnumber")
kde.poly <- fortify(ver, region = "id")
units <- grid.text(paste(round(ver$area,2)," ha"), x=0.9, y=0.95,
gp=gpar(fontface=4, cex=0.9), draw = FALSE)
kde.plot <- ggplot() +
geom_polygon(data=kde.poly, aes(x=kde.poly$long, y=kde.poly$lat), alpha = 0.5) +
geom_point(data=kde.points, aes(x=x, y=y)) + theme_bw() +
labs(x="Easting (m)", y="Northing (m)", title=kde.points$lizardnumber) +
theme(legend.position="none", plot.title = element_text(face = "bold", hjust = 0.5)) +
annotation_custom(units)
kde.plot
}
Function of KDE polygons for mapping
kde_analysis.href.polygon <- function(filename, percentage){
data <- read.csv(file = filename)
x <- as.data.frame(data$EASTING)
y <- as.data.frame(data$NORTHING)
xy <- c(x,y)
data.proj <- SpatialPointsDataFrame(xy,data, proj4string = CRS.SC)
xy <- SpatialPoints(data.proj@coords)
kde<-kernelUD(xy, h="href", kern="bivnorm", grid=1000)
ver <- getverticeshr(kde, percentage)
ver@proj4string<-CRS.SC
area <- as.data.frame(round(ver$area,4))
.rowNamesDF(area, make.names=TRUE) <- data$YEAR
write.table(area,file="KDE_Hectares.csv",
append=TRUE,sep=",", col.names=FALSE, row.names=TRUE)
kde.points <- cbind((data.frame(data.proj@coords)),data$YEAR)
colnames(kde.points) <- c("x","y","year")
kde.poly <- fortify(ver, region = "id")
units <- grid.text(paste(round(ver$area,2)," ha"), x=0.9, y=0.95,
gp=gpar(fontface=4, cex=0.9), draw = FALSE)
ver
}
Function of raster of UD
# kde_analysis.href.raster <- function(filename){
# data <- read.csv(file = filename)
# x <- as.data.frame(data$EASTING)
# y <- as.data.frame(data$NORTHING)
# xy <- c(x,y)
# data.proj <- SpatialPointsDataFrame(xy,data, proj4string = CRS.SC)
# xy <- SpatialPoints(data.proj@coords)
# kde<-kernelUD(xy, h="href", kern="bivnorm", grid=1000)
# kde<-as(kde, "SpatialGridDataFrame")
# kde@proj4string<- CRS.SC
# kde
# }
Function of trajectory analysis and distance over time
traj_analysis <- function(filename){
relocs_data <- read.csv(file = filename)
relocs <- as.ltraj(cbind(relocs_data$EASTING, relocs_data$NORTHING),id=relocs_data$LIZARDNUMBER, typeII = FALSE, date=NULL)
relocs.df <- ld(relocs)
relocs_dist <- as.data.frame(sum(sapply(relocs.df$dist, sum, na.rm=TRUE)))
colnames(relocs_dist) <- "Total Distance"
name <- relocs.df$id[1]
row.names(relocs_dist) <- name
relocs_units <- grid.text(paste(round(relocs_dist,2),"m"), x=0.9, y=0.9,
gp=gpar(fontface=3, col="black", cex=0.9), draw = FALSE)
reloc.plot <- ggplot() + theme_classic() + geom_path(data=relocs.df, aes(x=x,y=y), linetype = "dashed", colour = "red",
arrow = arrow(length=unit(.5,"cm"), angle = 20, ends="last", type = "closed")) +
geom_point(data=relocs.df, aes(x=x, y=y)) + geom_point(data=relocs.df, aes(x=x[1],
y=y[1]), size = 3, color = "darkgreen", pch=0) +
labs(x="Easting (m)", y="Northing (m)", title=relocs.df$id[1]) +
theme(legend.position="none", plot.title = element_text(face = "bold", hjust = 0.5)) +
annotation_custom(relocs_units)
reloc.plot
}
Function of distance of time
dist_analysis <- function(filename){
relocs_data <- read.csv(file = filename)
relocs <- as.ltraj(cbind(relocs_data$EASTING, relocs_data$NORTHING),id=relocs_data$LIZARDNUMBER, typeII = FALSE, date=NULL)
relocs.df <- ld(relocs)
relocs_dist <- as.data.frame(sum(sapply(relocs.df$dist, sum, na.rm=TRUE)))
colnames(relocs_dist) <- "Total Distance"
name <- relocs.df$id[1]
row.names(relocs_dist) <- name
write.table(relocs_dist,file="reloc_dist.csv",
append=TRUE,sep=",", col.names=FALSE, row.names=TRUE)
dist.plot
}
Map of yearly HR shifts of a subset of Gila Monsters. Includes running MCP polygons, Fortify mcp polygons for ggplot2 by YEAR

Raw group 100% MCP home range means of Stone Canyon and Owl Head Buttes. Grouped by environment and sex
Table 1 | Raw group 100% MCP home range means of Stone Canyon and Owl Head Buttes. Grouped by environment and sex.
| nonsubsidized |
female |
11 |
22.063636 |
12.287414 |
3.704795 |
8.254797 |
| nonsubsidized |
male |
14 |
43.235714 |
21.672372 |
5.792185 |
12.513255 |
| subsidized |
female |
38 |
9.839474 |
6.889003 |
1.117544 |
2.264359 |
| subsidized |
male |
15 |
11.825333 |
7.133668 |
1.841905 |
3.950494 |
Raw group 95% MCP home range means of Stone Canyon and Owl Head Buttes. Grouped by environment and sex
YR_GRP_Means95 <- summarySE(year, measurevar="Home_Range_95mcp",
groupvars=c("Environment","Sex"),na.rm = TRUE)
kable(YR_GRP_Means95, format = "pandoc", caption = 'Table 2 | Raw group 95% MCP home range means of raw data of Stone Canyon and Owl Head Buttes. Grouped by environment and sex.')
Table 2 | Raw group 95% MCP home range means of raw data of Stone Canyon and Owl Head Buttes. Grouped by environment and sex.
| nonsubsidized |
female |
6 |
20.600000 |
6.286493 |
2.566450 |
6.597270 |
| nonsubsidized |
male |
9 |
38.988889 |
15.815139 |
5.271713 |
12.156592 |
| subsidized |
female |
38 |
7.132895 |
4.280606 |
0.694406 |
1.407000 |
| subsidized |
male |
15 |
9.195333 |
5.246499 |
1.354640 |
2.905415 |
RM-ANOVA for 100% MCP analyses between the subsidized and non-subsidized
summary(RMmod.year)
Linear mixed model fit by REML. t-tests use Satterthwaite's method [lmerModLmerTest]
Formula: Home_Range_100mcp ~ Environment + Year + Sex + N100 + Environment *
Sex + (1 | Gila)
Data: year
REML criterion at convergence: 578.7
Scaled residuals:
Min 1Q Median 3Q Max
-2.51737 -0.36103 -0.04818 0.24140 3.14258
Random effects:
Groups Name Variance Std.Dev.
Gila (Intercept) 37.23 6.101
Residual 85.97 9.272
Number of obs: 79, groups: Gila, 31
Fixed effects:
Estimate Std. Error df t value Pr(>|t|)
(Intercept) -991.17075 1749.77011 67.87392 -0.566 0.57295
Environmentsubsidized -15.35332 8.57337 69.12686 -1.791 0.07770 .
Year 0.50199 0.87435 67.88010 0.574 0.56778
Sexmale 17.19067 5.06107 24.45954 3.397 0.00233 **
N100 0.18371 0.04247 52.43447 4.326 6.84e-05 ***
Environmentsubsidized:Sexmale -12.12232 6.51056 25.59879 -1.862 0.07413 .
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Correlation of Fixed Effects:
(Intr) Envrnm Year Sexmal N100
Envrnmntsbs 0.851
Year -1.000 -0.852
Sexmale -0.031 0.298 0.029
N100 0.069 0.124 -0.070 -0.057
Envrnmnts:S 0.031 -0.317 -0.030 -0.782 0.126
ANOVA table for 100% MCPs between the two populations
anova(RMmod.year)
Type III Analysis of Variance Table with Satterthwaite's method
Sum Sq Mean Sq NumDF DenDF F value Pr(>F)
Environment 593.69 593.69 1 72.975 6.9058 0.010467 *
Year 28.34 28.34 1 67.880 0.3296 0.567782
Sex 1019.81 1019.81 1 24.480 11.8624 0.002073 **
N100 1608.73 1608.73 1 52.434 18.7127 6.841e-05 ***
Environment:Sex 298.04 298.04 1 25.599 3.4668 0.074129 .
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
RM-ANOVA for 95% MCP analyses between the subsidized and non-subsidized
summary(RMmod.year95)
Linear mixed model fit by REML. t-tests use Satterthwaite's method [lmerModLmerTest]
Formula: Home_Range_95mcp ~ Environment + Year + Sex + N95 + Environment *
Sex + (1 | Gila)
Data: year
REML criterion at convergence: 427
Scaled residuals:
Min 1Q Median 3Q Max
-2.40965 -0.32439 -0.01753 0.33170 2.10809
Random effects:
Groups Name Variance Std.Dev.
Gila (Intercept) 62.74 7.921
Residual 14.71 3.835
Number of obs: 68, groups: Gila, 31
Fixed effects:
Estimate Std. Error df t value Pr(>|t|)
(Intercept) -847.23191 832.90246 36.03605 -1.017 0.315837
Environmentsubsidized -17.57933 5.60239 56.19888 -3.138 0.002710 **
Year 0.43227 0.41610 36.03494 1.039 0.305791
Sexmale 18.07841 4.86595 26.11740 3.715 0.000973 ***
N95 0.03418 0.03342 37.01539 1.023 0.313095
Environmentsubsidized:Sexmale -11.52577 5.79029 33.81958 -1.991 0.054663 .
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Correlation of Fixed Effects:
(Intr) Envrnm Year Sexmal N95
Envrnmntsbs 0.598
Year -1.000 -0.602
Sexmale -0.025 0.454 0.021
N95 -0.003 0.254 0.000 -0.027
Envrnmnts:S 0.004 -0.490 -0.001 -0.841 0.064
ANOVA table for 95% MCPs between the two populations
anova(RMmod.year95)
Type III Analysis of Variance Table with Satterthwaite's method
Sum Sq Mean Sq NumDF DenDF F value Pr(>F)
Environment 335.56 335.56 1 61.986 22.8175 1.131e-05 ***
Year 15.87 15.87 1 36.035 1.0792 0.3057907
Sex 266.80 266.80 1 33.473 18.1420 0.0001568 ***
N95 15.38 15.38 1 37.015 1.0459 0.3130948
Environment:Sex 58.27 58.27 1 33.820 3.9622 0.0546634 .
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Raw group means AND adjusted EMMs of Yearly Overall 100%MCP

Directional means of home range (100% MCP) after being adjusted for year, sex and sample size
kable(ref_dfRM_sex, format = "pandoc", caption = 'Table | Directional means of home range (100% MCP) after being adjusted for year, sex and sample size.')
Table | Directional means of home range (100% MCP) after being adjusted for year, sex and sample size.
| nonsubsidized |
female |
23.872887 |
6.030104 |
67.38353 |
11.838009 |
35.90777 |
| subsidized |
female |
8.300524 |
3.305743 |
48.63495 |
1.656123 |
14.94493 |
| nonsubsidized |
male |
43.544702 |
6.077155 |
66.92800 |
31.414411 |
55.67499 |
| subsidized |
male |
13.421268 |
4.084847 |
54.24885 |
5.232502 |
21.61003 |
summary(RM.95KDEmod.year)
Linear mixed model fit by REML. t-tests use Satterthwaite's method [lmerModLmerTest]
Formula: Home_Range_95kde ~ Environment + Year + Sex + N + Environment *
Sex + (1 | Gila)
Data: year
REML criterion at convergence: 450.5
Scaled residuals:
Min 1Q Median 3Q Max
-1.48925 -0.42071 -0.07388 0.41738 2.69609
Random effects:
Groups Name Variance Std.Dev.
Gila (Intercept) 175.44 13.25
Residual 60.06 7.75
Number of obs: 61, groups: Gila, 29
Fixed effects:
Estimate Std. Error df t value Pr(>|t|)
(Intercept) -1.565e+03 1.778e+03 3.477e+01 -0.880 0.38490
Environmentsubsidized -2.190e+01 1.132e+01 5.238e+01 -1.934 0.05856 .
Year 8.007e-01 8.883e-01 3.479e+01 0.901 0.37356
Sexmale 3.244e+01 9.318e+00 2.798e+01 3.481 0.00166 **
N -1.727e-02 7.301e-02 3.873e+01 -0.237 0.81428
Environmentsubsidized:Sexmale -1.805e+01 1.161e+01 2.512e+01 -1.554 0.13264
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Correlation of Fixed Effects:
(Intr) Envrnm Year Sexmal N
Envrnmntsbs 0.616
Year -1.000 -0.620
Sexmale 0.000 0.473 -0.003
N 0.040 0.357 -0.044 0.074
Envrnmnts:S 0.017 -0.476 -0.015 -0.796 0.026
anova(RM.95KDEmod.year)
Type III Analysis of Variance Table with Satterthwaite's method
Sum Sq Mean Sq NumDF DenDF F value Pr(>F)
Environment 578.08 578.08 1 54.632 9.6250 0.0030363 **
Year 48.80 48.80 1 34.786 0.8126 0.3735574
Sex 956.52 956.52 1 26.005 15.9260 0.0004788 ***
N 3.36 3.36 1 38.732 0.0559 0.8142796
Environment:Sex 145.08 145.08 1 25.121 2.4156 0.1326414
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
RM-ANOVA of 95% KDEs for the subsidized population
RM.KDEmod.year<-lmer(Home_Range_95kde~Year+Sex+N+(1|Gila),data = sub)
summary(RM.KDEmod.year)
ANOVA Table for 95%KDE
anova(RM.KDEmod.year)
Type III Analysis of Variance Table with Satterthwaite's method
Sum Sq Mean Sq NumDF DenDF F value Pr(>F)
Year 33.20 33.20 1 40.016 0.5720 0.453900
Sex 496.66 496.66 1 17.763 8.5562 0.009132 **
N 21.33 21.33 1 37.608 0.3675 0.548005
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
RM-ANOVA of 50% KDEs for the subsidized
RM.KDE.50.mod.year<-lmer(Home_Range_50kde~Year+Sex+N+(1|Gila),data = sub)
summary(RM.KDE.50.mod.year)
ANOVA Talbe of 50% KDE for the subsidized
anova(RM.KDE.50.mod.year)
TABLE. Raw Group 50% KDE home range means male and female home ranges at Stone Canyon
YR_GRP_Means.50KDE <- summarySE(sub, measurevar="Home_Range_50kde",
groupvars=c("Sex"),na.rm = TRUE)
kable(YR_GRP_Means.50KDE, format = "pandoc", caption = 'Table 5 | Raw Group 50% KDE home range means male and female home ranges at Stone Canyon.')
Raw group means AND adjusted EMMs of Yearly Overall 95% KDEs between non/subsidized populations

Collective grid of 100% MCP and 95% KDE of both sites from above

43.4 male 42.9 female Yearly overall means of 95% KDEs grouped by site and sex
YR_Means.95KDEall <- summarySE(year, measurevar="Home_Range_95kde",
groupvars=c("Environment","Sex"),na.rm = TRUE)
kable(YR_Means.95KDEall, format = "pandoc", caption = 'Table | Raw Group 95% KDE home range means male and female home ranges at non/subsidized.')
Table | Raw Group 95% KDE home range means male and female home ranges at non/subsidized.
| nonsubsidized |
female |
5 |
36.80000 |
9.603905 |
4.294997 |
11.924824 |
| nonsubsidized |
male |
6 |
69.40000 |
27.763789 |
11.334520 |
29.136310 |
| subsidized |
female |
37 |
22.98892 |
11.046272 |
1.815996 |
3.683010 |
| subsidized |
male |
13 |
35.00308 |
12.057546 |
3.344161 |
7.286302 |
Pairwise Comparisons, between sexes by environment, and between environments averaged across sex
emm_s.TK
$emmeans
Sex = female:
Environment emmean SE df lower.CL upper.CL
nonsubsidized 23.76 6.25 68.3 11.29 36.2
subsidized 8.41 3.47 49.8 1.45 15.4
Sex = male:
Environment emmean SE df lower.CL upper.CL
nonsubsidized 40.95 6.17 69.7 28.65 53.3
subsidized 13.48 4.27 55.3 4.91 22.0
Degrees-of-freedom method: kenward-roger
Confidence level used: 0.95
$contrasts
Sex = female:
contrast estimate SE df t.ratio p.value
nonsubsidized - subsidized 15.4 8.72 70.5 1.761 0.0826
Sex = male:
contrast estimate SE df t.ratio p.value
nonsubsidized - subsidized 27.5 9.13 71.7 3.009 0.0036
Graphical Comparisons of Sex Within Each Environment:
plot(emm_s.t2, comparisons = TRUE, xlab = "Least Square Mean (ha)", ylab = "Environment")
Pairwise by sex between enviornements 100% MCP, and 95% KDEs
emm_s.t3
$emmeans
Sex = female:
Environment emmean SE df lower.CL upper.CL
nonsubsidized 23.76 6.25 68.3 11.29 36.2
subsidized 8.41 3.47 49.8 1.45 15.4
Sex = male:
Environment emmean SE df lower.CL upper.CL
nonsubsidized 40.95 6.17 69.7 28.65 53.3
subsidized 13.48 4.27 55.3 4.91 22.0
Degrees-of-freedom method: kenward-roger
Confidence level used: 0.95
$contrasts
Sex = female:
contrast estimate SE df t.ratio p.value
nonsubsidized - subsidized 15.4 8.72 70.5 1.761 0.0826
Sex = male:
contrast estimate SE df t.ratio p.value
nonsubsidized - subsidized 27.5 9.13 71.7 3.009 0.0036
Graphical Comparisons of Sex between the two populations:
plot(emm_s.t3, comparisons = TRUE, xlab = "Least Square Mean (ha)", ylab = "Environment")
Ineractive map of MCPs at Stone Canyon
Create stagnant stamen map of MCPs at Stone Canyon
Error: Don't know how to add north2(SC_stamen_map, x = 0.89, y = 0.85, scale = 0.1, symbol = 16) to a plot

myMap
768x1280 terrain map image from Stamen Maps.
See ?ggmap to plot it.




Interactive map of KDEs at Stone Canyon
TABLE
Table | Subsidized and non-subsidized directional means of KDE home ranges after being adjusted for year, sex and sample size.
| nonsubsidized |
female |
42.44837 |
9.346459 |
53.01148 |
23.70185 |
61.19490 |
| subsidized |
female |
20.93992 |
4.083131 |
22.92042 |
12.49169 |
29.38814 |
| nonsubsidized |
male |
80.81873 |
9.084540 |
52.50968 |
62.59348 |
99.04398 |
| subsidized |
male |
35.27439 |
5.501543 |
29.24014 |
24.02648 |
46.52229 |
SEASONAL ANALYSES
Map of seasonal fluctions of home ranges
## Create MCP polygons by SEASON:
M215_mcp.EM<-mcp_analysis.POLY("./M215/Emergence .csv", percentage= 100)
M215_mcp.DRY<-mcp_analysis.POLY("./M215/Dry .csv", percentage= 100)
M215_mcp.MON<-mcp_analysis.POLY("./M215/Monsoon .csv", percentage= 100)
M112_mcp.DRY<-mcp_analysis.POLY("./M112/Dry .csv", percentage= 100)
M112_mcp.MON<-mcp_analysis.POLY("./M112/Monsoon .csv", percentage= 100)
M112_mcp.PM<-mcp_analysis.POLY("./M112/Post_Monsoon .csv", percentage= 100)
M119_mcp.DRY<-mcp_analysis.POLY("./M119/Dry .csv", percentage= 100)
M119_mcp.MON<-mcp_analysis.POLY("./M119/Monsoon .csv", percentage= 100)
M119_mcp.PM<-mcp_analysis.POLY("./M119/Post_Monsoon .csv", percentage= 100)
F114_mcp.EM<-mcp_analysis.POLY("./F114/Emergence .csv", percentage= 100)
F114_mcp.DRY<-mcp_analysis.POLY("./F114/Dry .csv", percentage= 100)
F114_mcp.MON<-mcp_analysis.POLY("./F114/Monsoon .csv", percentage= 100)
F114_mcp.PM<-mcp_analysis.POLY("./F114/Post_Monsoon .csv", percentage= 100)
F137_mcp.EM<-mcp_analysis.POLY("./F137/Emergence .csv", percentage= 100)
F137_mcp.DRY<-mcp_analysis.POLY("./F137/Dry .csv", percentage= 100)
F137_mcp.MON<-mcp_analysis.POLY("./F137/Monsoon .csv", percentage= 100)
F137_mcp.PM<-mcp_analysis.POLY("./F137/Post_Monsoon .csv", percentage= 100)
F147_mcp.EM<-mcp_analysis.POLY("./F147/Emergence .csv", percentage= 100)
F147_mcp.DRY<-mcp_analysis.POLY("./F147/Dry .csv", percentage= 100)
F147_mcp.MON<-mcp_analysis.POLY("./F147/Monsoon .csv", percentage= 100)
F147_mcp.PM<-mcp_analysis.POLY("./F147/Post_Monsoon .csv", percentage= 100)
F252_mcp.EM<-mcp_analysis.POLY("./F252/Emergence .csv", percentage= 100)
F252_mcp.DRY<-mcp_analysis.POLY("./F252/Dry .csv", percentage= 100)
F252_mcp.MON<-mcp_analysis.POLY("./F252/Monsoon .csv", percentage= 100)
F252_mcp.PM<-mcp_analysis.POLY("./F252/Post_Monsoon .csv", percentage= 100)
F36_mcp.EM<-mcp_analysis.POLY("./F36/Emergence .csv", percentage= 100)
F36_mcp.DRY<-mcp_analysis.POLY("./F36/Dry .csv", percentage= 100)
F36_mcp.MON<-mcp_analysis.POLY("./F36/Monsoon .csv", percentage= 100)
F36_mcp.PM<-mcp_analysis.POLY("./F36/Post_Monsoon .csv", percentage= 100)
F66_mcp.EM<-mcp_analysis.POLY("./F66/Emergence .csv", percentage= 100)
F66_mcp.DRY<-mcp_analysis.POLY("./F66/Dry .csv", percentage= 100)
F66_mcp.MON<-mcp_analysis.POLY("./F66/Monsoon .csv", percentage= 100)
F66_mcp.PM<-mcp_analysis.POLY("./F66/Post_Monsoon .csv", percentage= 100)
## Fortify mcp polygons for ggplot2 *SEASON*:
M215_mcp.EMT <- fortify(M215_mcp.EM, region = "id")
M215_mcp.DRYT <- fortify(M215_mcp.DRY, region = "id")
M215_mcp.MONT <- fortify(M215_mcp.MON, region = "id")
M112_mcp.DRYT <- fortify(M112_mcp.DRY, region = "id")
M112_mcp.MONT <- fortify(M112_mcp.MON, region = "id")
M112_mcp.PMT <- fortify(M112_mcp.PM, region = "id")
M119_mcp.DRYT <- fortify(M119_mcp.DRY, region = "id")
M119_mcp.MONT <- fortify(M119_mcp.MON, region = "id")
M119_mcp.PMT <- fortify(M119_mcp.PM, region = "id")
F114_mcp.EMT <- fortify(F114_mcp.EM, region = "id")
F114_mcp.DRYT <- fortify(F114_mcp.DRY, region = "id")
F114_mcp.MONT <- fortify(F114_mcp.MON, region = "id")
F114_mcp.PMT <- fortify(F114_mcp.PM, region = "id")
F137_mcp.EMT <- fortify(F137_mcp.EM, region = "id")
F137_mcp.DRYT <- fortify(F137_mcp.DRY, region = "id")
F137_mcp.MONT <- fortify(F137_mcp.MON, region = "id")
F137_mcp.PMT <- fortify(F137_mcp.PM, region = "id")
F147_mcp.EMT <- fortify(F147_mcp.EM, region = "id")
F147_mcp.DRYT <- fortify(F147_mcp.DRY, region = "id")
F147_mcp.MONT <- fortify(F147_mcp.MON, region = "id")
F147_mcp.PMT <- fortify(F147_mcp.PM, region = "id")
F252_mcp.EMT <- fortify(F252_mcp.EM, region = "id")
F252_mcp.DRYT <- fortify(F252_mcp.DRY, region = "id")
F252_mcp.MONT <- fortify(F252_mcp.MON, region = "id")
F252_mcp.PMT <- fortify(F252_mcp.PM, region = "id")
F36_mcp.EMT <- fortify(F36_mcp.EM, region = "id")
F36_mcp.DRYT <- fortify(F36_mcp.DRY, region = "id")
F36_mcp.MONT <- fortify(F36_mcp.MON, region = "id")
F36_mcp.PMT <- fortify(F36_mcp.PM, region = "id")
F66_mcp.EMT <- fortify(F66_mcp.EM, region = "id")
F66_mcp.DRYT <- fortify(F66_mcp.DRY, region = "id")
F66_mcp.MONT <- fortify(F66_mcp.MON, region = "id")
F66_mcp.PMT <- fortify(F66_mcp.PM, region = "id")
mcp.shift.TEST5 <- ggplot() +
geom_polygon(data=F114_mcp.EMT, aes(x=F114_mcp.EMT$long, y=F114_mcp.EMT$lat),
alpha=0.1,colour="blue",linetype=2) +
geom_polygon(data=F114_mcp.DRYT, aes(x=F114_mcp.DRYT$long, y=F114_mcp.DRYT$lat),
alpha=0.1,colour="red",linetype=3) +
geom_polygon(data=F114_mcp.MONT, aes(x=F114_mcp.MONT$long, y=F114_mcp.MONT$lat),
alpha=0.1,colour="green",linetype=4) +
geom_polygon(data=F114_mcp.PMT, aes(x=F114_mcp.PMT$long, y=F114_mcp.PMT$lat),
alpha=0.1,colour="black",linetype=5) +
geom_polygon(data=F137_mcp.EMT, aes(x=F137_mcp.EMT$long, y=F137_mcp.EMT$lat),
alpha=0.1,colour="blue",linetype=2) +
geom_polygon(data=F137_mcp.DRYT, aes(x=F137_mcp.DRYT$long, y=F137_mcp.DRYT$lat),
alpha=0.1,colour="red",linetype=3) +
geom_polygon(data=F137_mcp.MONT, aes(x=F137_mcp.MONT$long, y=F137_mcp.MONT$lat),
alpha=0.1,colour="green",linetype=4) +
geom_polygon(data=F137_mcp.PMT, aes(x=F137_mcp.PMT$long, y=F137_mcp.PMT$lat),
alpha=0.1,colour="black",linetype=5) +
geom_polygon(data=F147_mcp.EMT, aes(x=F147_mcp.EMT$long, y=F147_mcp.EMT$lat),
alpha=0.1,colour="blue",linetype=2) +
geom_polygon(data=F147_mcp.DRYT, aes(x=F147_mcp.DRYT$long, y=F147_mcp.DRYT$lat),
alpha=0.1,colour="red",linetype=3) +
geom_polygon(data=F147_mcp.MONT, aes(x=F147_mcp.MONT$long, y=F147_mcp.MONT$lat),
alpha=0.1,colour="green",linetype=4) +
geom_polygon(data=F147_mcp.PMT, aes(x=F147_mcp.PMT$long, y=F147_mcp.PMT$lat),
alpha=0.1,colour="black",linetype=5) +
# geom_polygon(data=F252_mcp.EMT, aes(x=F252_mcp.EMT$long, y=F252_mcp.EMT$lat),
# alpha=0.1,colour="black",linetype=2) +
# geom_polygon(data=F252_mcp.DRYT, aes(x=F252_mcp.DRYT$long, y=F252_mcp.DRYT$lat),
# alpha=0.1,colour="black",linetype=3) +
# geom_polygon(data=F252_mcp.MONT, aes(x=F252_mcp.MONT$long, y=F252_mcp.MONT$lat),
# alpha=0.1,colour="black",linetype=4) +
# geom_polygon(data=F252_mcp.PMT, aes(x=F252_mcp.PMT$long, y=F252_mcp.PMT$lat),
# alpha=0.1,colour="black",linetype=5) +
geom_polygon(data=F36_mcp.EMT, aes(x=F36_mcp.EMT$long, y=F36_mcp.EMT$lat),
alpha=0.1,colour="blue",linetype=2) +
geom_polygon(data=F36_mcp.DRYT, aes(x=F36_mcp.DRYT$long, y=F36_mcp.DRYT$lat),
alpha=0.1,colour="red",linetype=3) +
geom_polygon(data=F36_mcp.MONT, aes(x=F36_mcp.MONT$long, y=F36_mcp.MONT$lat),
alpha=0.1,colour="green",linetype=4) +
geom_polygon(data=F36_mcp.PMT, aes(x=F36_mcp.PMT$long, y=F36_mcp.PMT$lat),
alpha=0.1,colour="black",linetype=5) +
geom_polygon(data=F66_mcp.EMT, aes(x=F66_mcp.EMT$long, y=F66_mcp.EMT$lat),
alpha=0.1,colour="blue",linetype=2) +
geom_polygon(data=F66_mcp.DRYT, aes(x=F66_mcp.DRYT$long, y=F66_mcp.DRYT$lat),
alpha=0.1,colour="red",linetype=3) +
geom_polygon(data=F66_mcp.MONT, aes(x=F66_mcp.MONT$long, y=F66_mcp.MONT$lat),
alpha=0.1,colour="green",linetype=4) +
geom_polygon(data=F66_mcp.PMT, aes(x=F66_mcp.PMT$long, y=F66_mcp.PMT$lat),
alpha=0.1,colour="black",linetype=5) +
theme_bw() +
labs(x="Easting (m)", y="Northing (m)") +
labs(caption = "Figure 6 | SC seasonal home range shifts of five lizards. All seasonal polygons stay relatively stable with \n considerable overlap and without any major shifts.")+
theme(plot.caption = element_text(hjust = 0,lineheight = 0.9))+
theme(legend.position="none", plot.title = element_text(face = "bold", hjust = 0.5))
mcp.shift.TEST5
TABLE group means of seasonal home ranges between the two populations averaged across sex
seasonal<-read.csv("SC_Seasonal_Data.csv")
library(Rmisc)
SEAS_GRP_Means <- summarySE(seasonal, measurevar="Home_Range_100mcp",
groupvars=c("Environment","Season"), na.rm = TRUE)
# SEAS_GRP_Means
kable(SEAS_GRP_Means, format = "pandoc", caption = 'Table 6 | Group means of seasonal home ranges between Stone Canyon (subsidized) and Owl Head Buttes (non-subsidized). These means are averaged across sex.')
RM-ANOVA for seasonal home ranges between environments
library(lme4)
library(readr)
library(lmerTest)
# seasonal<-read.csv("SC_Seasonal_Data.csv")
RM.mod.Season <- lmer(Home_Range_100mcp~Environment+Season+Sex+N+Environment*Season+(1|Gila),
data=seasonal)
summary(RM.mod.Season)
ANOVA table of seasonal HRs between envs.
anova(RM.mod.Season)
TABLE of seasonal home ranges by sex between the two populations
SEAS_GRP_TEST <- summarySE(seasonal, measurevar="Home_Range_100mcp",
groupvars=c("Environment","Season","Sex"), na.rm = TRUE)
# SEAS_GRP_Means
kable(SEAS_GRP_TEST, format = "pandoc", caption = 'Table 7 | Seasonal home range means between Stone Canyon (subsidized) and Owl Head Buttes (non-subsidized) popuations for males and females. These are raw means before being adjusted for environment, season, sex, and sample size.')
Table 7 | Seasonal home range means between Stone Canyon (subsidized) and Owl Head Buttes (non-subsidized) popuations for males and females. These are raw means before being adjusted for environment, season, sex, and sample size.
| nonsubsidized |
Dry |
female |
5 |
15.6600000 |
8.6291946 |
3.8590932 |
10.7145603 |
| nonsubsidized |
Dry |
male |
7 |
29.4714286 |
12.6476235 |
4.7803524 |
11.6971008 |
| nonsubsidized |
Emergence |
female |
5 |
4.4600000 |
3.4333657 |
1.5354478 |
4.2630866 |
| nonsubsidized |
Emergence |
male |
5 |
1.1600000 |
1.8242807 |
0.8158431 |
2.2651436 |
| nonsubsidized |
Monsoon |
female |
6 |
22.9833333 |
9.8151753 |
4.0070285 |
10.3003948 |
| nonsubsidized |
Monsoon |
male |
7 |
24.2285714 |
9.8668999 |
3.7293376 |
9.1253605 |
| nonsubsidized |
Post_Monsoon |
female |
4 |
1.4000000 |
1.4491377 |
0.7245688 |
2.3059014 |
| nonsubsidized |
Post_Monsoon |
male |
7 |
0.2857143 |
0.3670993 |
0.1387505 |
0.3395102 |
| subsidized |
Dry |
female |
11 |
10.1754545 |
8.0883118 |
2.4387178 |
5.4338018 |
| subsidized |
Dry |
male |
6 |
18.2816667 |
13.2661214 |
5.4158714 |
13.9219406 |
| subsidized |
Emergence |
female |
6 |
2.1133333 |
1.8474920 |
0.7542354 |
1.9388239 |
| subsidized |
Emergence |
male |
3 |
2.0666667 |
1.5326556 |
0.8848792 |
3.8073277 |
| subsidized |
Monsoon |
female |
11 |
10.6918182 |
8.4988679 |
2.5625051 |
5.7096172 |
| subsidized |
Monsoon |
male |
7 |
10.3528571 |
6.3010018 |
2.3815548 |
5.8274547 |
| subsidized |
Post_Monsoon |
female |
11 |
3.6309091 |
5.5527983 |
1.6742317 |
3.7304207 |
| subsidized |
Post_Monsoon |
male |
3 |
0.6333333 |
0.8007705 |
0.4623250 |
1.9892241 |
figures for raw seasonal home ranges between the two populations

Figures Adjusted EMMs of seasonal home range between the two populations

Collective grid of raw and adjusted seasonal home ranges
ggarrange(raw.seasonal, adj.seasonal, labels = c("A", "B"),
nrow = 2)

Post hoc analyses of seasonal home ranges
Pairwise of each season between populations, overaged over levels of sex
emm_s.t <- emmeans(RM.mod.Season, pairwise ~ Environment | Season)
emm_s.t
$emmeans
Season = Dry:
Environment emmean SE df lower.CL upper.CL
nonsubsidized 18.66 2.13 85.1 14.428 22.89
subsidized 13.21 1.68 84.3 9.866 16.56
Season = Emergence:
Environment emmean SE df lower.CL upper.CL
nonsubsidized 3.36 2.11 85.3 -0.844 7.56
subsidized 3.99 2.44 83.5 -0.864 8.84
Season = Monsoon:
Environment emmean SE df lower.CL upper.CL
nonsubsidized 21.77 1.92 83.7 17.943 25.59
subsidized 8.60 1.69 82.8 5.239 11.96
Season = Post_Monsoon:
Environment emmean SE df lower.CL upper.CL
nonsubsidized 3.21 2.26 83.7 -1.290 7.72
subsidized 3.99 2.08 84.1 -0.152 8.13
Results are averaged over the levels of: Sex
Degrees-of-freedom method: kenward-roger
Confidence level used: 0.95
$contrasts
Season = Dry:
contrast estimate SE df t.ratio p.value
nonsubsidized - subsidized 5.448 2.67 85.0 2.037 0.0448
Season = Emergence:
contrast estimate SE df t.ratio p.value
nonsubsidized - subsidized -0.630 3.16 85.1 -0.199 0.8426
Season = Monsoon:
contrast estimate SE df t.ratio p.value
nonsubsidized - subsidized 13.167 2.52 83.5 5.219 <.0001
Season = Post_Monsoon:
contrast estimate SE df t.ratio p.value
nonsubsidized - subsidized -0.776 2.99 86.4 -0.259 0.7960
Results are averaged over the levels of: Sex
Graphical comparisons
plot(emm_s.t, comparisons = TRUE)
Pairwise between seasons within each popultion
emm_s.t4
$emmeans
Environment = nonsubsidized:
Season emmean SE df lower.CL upper.CL
Dry 18.86 2.25 88.4 14.383 23.34
Emergence 3.33 2.24 88.7 -1.118 7.77
Monsoon 21.85 2.03 87.5 17.811 25.89
Post_Monsoon 2.36 2.36 87.0 -2.322 7.04
Environment = subsidized:
Season emmean SE df lower.CL upper.CL
Dry 12.23 1.75 87.4 8.745 15.72
Emergence 4.32 2.55 84.7 -0.741 9.39
Monsoon 9.04 1.78 86.0 5.515 12.57
Post_Monsoon 5.09 2.07 85.8 0.981 9.21
Results are averaged over the levels of: Sex
Degrees-of-freedom method: kenward-roger
Confidence level used: 0.95
$contrasts
Environment = nonsubsidized:
contrast estimate SE df t.ratio p.value
Dry - Emergence 15.532 3.07 69.4 5.054 <.0001
Dry - Monsoon -2.992 2.89 67.3 -1.036 0.7292
Dry - Post_Monsoon 16.500 3.24 78.9 5.098 <.0001
Emergence - Monsoon -18.524 2.91 68.0 -6.361 <.0001
Emergence - Post_Monsoon 0.968 3.08 73.0 0.314 0.9891
Monsoon - Post_Monsoon 19.492 3.03 74.0 6.426 <.0001
Environment = subsidized:
contrast estimate SE df t.ratio p.value
Dry - Emergence 7.907 3.11 88.6 2.543 0.0602
Dry - Monsoon 3.187 2.28 66.0 1.395 0.5070
Dry - Post_Monsoon 7.137 2.68 80.2 2.666 0.0450
Emergence - Monsoon -4.720 3.20 89.6 -1.475 0.4569
Emergence - Post_Monsoon -0.769 2.94 77.2 -0.262 0.9937
Monsoon - Post_Monsoon 3.951 2.78 84.9 1.421 0.4899
Results are averaged over the levels of: Sex
P value adjustment: tukey method for comparing a family of 4 estimates
Graphical Comps
plot(emm_s.t4, comparisons = TRUE)
Pairwise between sexes of each season of the subsidized population
sub <- subset(seasonal, Environment == "subsidized")
RM.mod.Sub <- lmer(Home_Range_100mcp~Season+Sex+N+Season*Sex+(1|Gila), data=sub)
emm_s.t5 <- emmeans(RM.mod.Sub, pairwise ~ Sex | Season)
emm_s.t5
Graphical Comps
plot(emm_s.t5, comparisons = TRUE)
Pairwise between sexes of each season of the non-subsidized population
nonsub <- subset(seasonal, Environment == "nonsubsidized")
View(nonsub)
RM.mod.NSub <- lmer(Home_Range_100mcp~Season+Sex+N+Season*Sex+(1|Gila), data=nonsub)
emm_s.t6 <- emmeans(RM.mod.NSub, pairwise ~ Sex | Season)
emm_s.t6
Graphical Comps
plot(emm_s.t6, comparisons = TRUE)
LS0tCnRpdGxlOiAiU3BhdGlhbCBTY3JpcHRzIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgoKCmBgYHtyfQpwYWNrcmF0Ojppbml0KCJ+L0Rlc2t0b3AvSGVsb2Rlcm1hIFNwYXRpYWwvSGVsb2Rlcm1hIFNwYXRpYWwiKQpgYGAKCgoKYGBge3J9CiMgcmVxdWlyZWQgcGFja2FnZXMKbGlicmFyeShhZGVoYWJpdGF0SFIpICNmb3IgaG9tZSByYW5nZSBjYWxjdWxhdGlvbnMKbGlicmFyeShkYXRhLnRhYmxlKSAjbWFuaXB1bGF0ZSBTMyBhbmQgUzQgZGF0YSB0YWJsZXMKbGlicmFyeShnZ3Bsb3QyKSAjZm9yIGdyYXBoaWMgb3V0cHV0CmxpYnJhcnkoZ2dmb3J0aWZ5KSAjdG8gYWxsb3cgZ2dwbG90MiB0byByZWFkIHNwYXRpYWwgZGF0YQpsaWJyYXJ5KGdyaWQpICN0byBhZGQgYW5ub3RhdGlvbnMgdG8gdGhlIG91dHB1dAojIGxpYnJhcnkoT3BlblN0cmVldE1hcCkgI2ZvciBvYnRhaW5pbmcgcmFzdGVyIGltYWdlcwpsaWJyYXJ5KHBiYXBwbHkpICNuZWVkZWQgZm9yIHByb2dyZXNzIGJhcgpsaWJyYXJ5KHBsb3RseSkgI2ZvciBpbnRlcmFjdGl2ZSB4eSBwbG90CmxpYnJhcnkocmdkYWwpICNmb3IgY29udmVydGluZyBzcGF0aWFsIGRhdGEKbGlicmFyeShzcCkgI2ZvciBjb252ZXJ0aW5nIHNwYXRpYWwgZGF0YQpsaWJyYXJ5KHJnZW9zKQojIGxpYnJhcnkocmFzdGVyKQpsaWJyYXJ5KG1hcHZpZXcpCgpgYGAKCgoKCgpPdmVyYWxsIGluZGl2aWR1YWwgeWVhcmx5IGhvbWUgcmFuZ2VzIGZvciBub24vc3Vic2lkaXplZCBwb3B1bGF0aW9ucwpgYGB7ciBlY2hvPUZBTFNFfQpHTV90YWJsZSA8LSByZWFkX2NzdigiR01fdGFibGUuY3N2IikKa2FibGUoR01fdGFibGUsZm9ybWF0PSJwYW5kb2MiLCBjYXB0aW9uPSdUYWJsZSAxIHwgUG9vbGVkIG92ZXJhbGwgaG9tZSByYW5nZXMgb2YgR2lsYSBNb25zdGVycyBhdCBPd2wgSGVhZCBCdXR0ZXMgYW5kIFN0b25lIENhbnlvbiBHb2xmIENsdWIuIEJvdGggMTAwJSBhbmQgOTUlIE1DUHMgd2VyZSBjYWxjdWxhdGVkIGJldHdlZW4gYm90aCBwb3B1bGF0aW9ucy4nKQpgYGAKCgoKCgpHaWxhIG1vbnN0ZXIgbG9jYXRpb25zIGZvciBhbGwgdHJhY2tlZCBsaXphcmRzIGFjcm9zcyBTdG9uZSBDYW55b24KYGBge3J9CkFsbC5HaWxhcyA8LSByZWFkX2NzdigiLi9HTV9GaW5hbF9EYXRhLmNzdiIpCgp1dG1fcG9pbnRzIDwtIGNiaW5kKEFsbC5HaWxhcyRFQVNUSU5HLCBBbGwuR2lsYXMkTk9SVEhJTkcpCgp1dG1fbG9jYXRpb25zIDwtIFNwYXRpYWxQb2ludHModXRtX3BvaW50cywgcHJvajRzdHJpbmc9Q1JTLlNDKQoKcHJval9sYXQubG9uIDwtIGFzLmRhdGEuZnJhbWUoc3BUcmFuc2Zvcm0odXRtX2xvY2F0aW9ucywgQ1JTKCIrcHJvaj1sb25nbGF0ICtkYXR1bT1XR1M4NCIpKSkKY29sbmFtZXMocHJval9sYXQubG9uKSA8LSBjKCJ4IiwieSIpCgojIyBGT1JUSUdZIFNQQVRJQUwgU1BBVElBTCBQT0lOVFMgRk9SIFBMT1RUSU5HOgpwcm9qX2xhdC5sb24gPC0gZm9ydGlmeShwcm9qX2xhdC5sb24sIHJlZ2lvbiA9ICJUeXBlIikKCm15TWFwIDwtIGdldF9zdGFtZW5tYXAoYmJveCA9IGMobGVmdCA9IC0xMTEuMDA5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvdHRvbSA9IDMyLjQ1OSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByaWdodCA9IC0xMTAuOTY5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvcCA9IDMyLjQ3NCksCiAgICAgICAgICAgICAgICAgICAgICAgbWFwdHlwZSA9ICJ0ZXJyYWluIiwgCiAgICAgICAgICAgICAgICAgICAgICAgY3JvcCA9IEZBTFNFLAogICAgICAgICAgICAgICAgICAgICAgIHpvb20gPSAxNSkKCmdnbWFwKG15TWFwKStnZW9tX3BvaW50KGRhdGE9cHJval9sYXQubG9uLCBhZXMoeD14LCB5PXkpLCBzaXplPTAuMykKYGBgCgoKCgoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBPVkVSQUxMIFlFQVJMWSBBTkFMWVNFUyAjIyMjIyMjIyMjIyMjIyMjIyMjIwoKClBsb3Qgb2YgMTAwJSAgTUNQIEhScyBhZ2FpbnN0IG51bWJlciBvZiByZWxvY2F0aW9ucwpgYGB7cn0KeWVhciA8LSByZWFkX2NzdigiR01fQ29uc29saWRhdGVkX0J5WWVhci5jc3YiKQoKIyBxdWljayBwbG90CiMgR3JhcGgxPC1nZ3Bsb3QoeWVhcixhZXMoeD1OMTAwLHk9SG9tZV9SYW5nZV8xMDBtY3AsZ3JvdXA9RW52aXJvbm1lbnQpKSsKR3JhcGgxPC1nZ3Bsb3QoeWVhcixhZXMoeD1OMTAwLHk9SG9tZV9SYW5nZV8xMDBtY3ApKSsKICBnZW9tX3BvaW50KGFlcyhzaGFwZSA9IGZhY3RvcihFbnZpcm9ubWVudCkpLCBzaXplID0gNCkrCiAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcz1jKDE2LCAyKSkrCiAgZ2VvbV9zbW9vdGgoYWVzKGxpbmV0eXBlPUVudmlyb25tZW50KSxjb2xvdXI9ImJsYWNrIiwgbWV0aG9kPSJsbSIpICsKICAjIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzPWMoc3Vic2lkaXplZD0iY3lhbjMiLG5vbnN1YnNpZGl6ZWQ9ImluZGlhbiByZWQxIikpKwogICMgbGFicyh0aXRsZSA9ICIxMDAlIE1DUCBIb21lIFJhbmdlcyIpKwogIHhsYWIoIk51bWJlciBvZiBSZWxvY2F0aW9ucyIpKwogIHlsYWIoIjEwMCUgTUNQIEFyZWEgKGhhKSIpKwogIAogIHRoZW1lKHBsb3QuY2FwdGlvbiA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAsbGluZWhlaWdodCA9IDAuOSkpCiAgIyB0aGVtZV9idygpCgpHcmFwaDE8LUdyYXBoMSt0aGVtZShheGlzLnRpdGxlPWVsZW1lbnRfdGV4dChzaXplID0gMTgpKQoKIyBsZWdlbmQgYXQgdG9wLWxlZnQsIGluc2lkZSB0aGUgcGxvdApTQ09ILmhyLmZpZzwtR3JhcGgxICsgdGhlbWUobGVnZW5kLnRpdGxlID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLAogICAgICAgICAgICAgICBsZWdlbmQuanVzdGlmaWNhdGlvbj1jKDAsMSksCiAgICAgICAgICAgICAgIGxlZ2VuZC5wb3NpdGlvbj1jKDAuMDUsIDAuOTUpLAogICAgICAgICAgICAgICBsZWdlbmQuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAgICAgICAgbGVnZW5kLmtleSA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAgICAgICAgbGVnZW5kLmJveC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGNvbG91ciA9ICJibGFjayIpKSArCiAgICAgICAgICAgICAgIHNjYWxlX3NoYXBlX2Rpc2NyZXRlKG5hbWUgID0iIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBicmVha3M9Yygibm9uc3Vic2lkaXplZCIsICJzdWJzaWRpemVkIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzPWMoIk5vbnN1YnNpZGl6ZWQiLCAiU3Vic2lkaXplZCIpKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZV9saW5ldHlwZV9kaXNjcmV0ZShuYW1lICA9IiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtzPWMoIm5vbnN1YnNpZGl6ZWQiLCAic3Vic2lkaXplZCIpLAogICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscz1jKCJOb25zdWJzaWRpemVkIiwgIlN1YnNpZGl6ZWQiKSkKClNDT0guaHIuZmlnCiMgZGlyLmNyZWF0ZSgib3V0cHV0cyIpICMgY3JlYXRlIGEgbmV3IGZvbGRlciB0byBob2xkIHRoZSBvdXRwdXQgZmlsZXMKIyBnZ3NhdmUoIm91dHB1dHMvU0NfT0hCX3Bsb3QucGRmIikKYGBgCgoKClBsb3Qgb2YgOTUlIEtERXMgYWdhaW5zdCByZWxvY2F0aW9ucwpgYGB7cn0KeWVhcjIgPC0gcmVhZF9jc3YoIkdNX0NvbnNvbGlkYXRlZF9CeVllYXJfSW5wdXQuY3N2IikKCiMgcXVpY2sgcGxvdAojIEdyYXBoMTwtZ2dwbG90KHllYXIsYWVzKHg9TjEwMCx5PUhvbWVfUmFuZ2VfMTAwbWNwLGdyb3VwPUVudmlyb25tZW50KSkrCkdyYXBoMjwtZ2dwbG90KHllYXIsYWVzKHg9Tix5PUhvbWVfUmFuZ2VfOTVrZGUpKSsKICBnZW9tX3BvaW50KGFlcyhzaGFwZSA9IGZhY3RvcihFbnZpcm9ubWVudCkpLCBzaXplID0gNCkrCiAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcz1jKDE2LCAyKSkrCiAgZ2VvbV9zbW9vdGgoYWVzKGxpbmV0eXBlPUVudmlyb25tZW50KSxjb2xvdXI9ImJsYWNrIiwgbWV0aG9kPSJsbSIpICsKICAjIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzPWMoc3Vic2lkaXplZD0iY3lhbjMiLG5vbnN1YnNpZGl6ZWQ9ImluZGlhbiByZWQxIikpKwogICMgbGFicyh0aXRsZSA9ICIxMDAlIE1DUCBIb21lIFJhbmdlcyIpKwogIHhsYWIoIk51bWJlciBvZiBSZWxvY2F0aW9ucyIpKwogIHlsYWIoIjk1JSBLREUgQXJlYSAoaGEpIikrCiAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cz0gYygwLDEyNSksIGJyZWFrcyA9IGMoMCwyNSw1MCw3NSwxMDAsMTI1KSkgKwogIHRoZW1lKHBsb3QuY2FwdGlvbiA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAsbGluZWhlaWdodCA9IDAuOSkpCiAgIyB0aGVtZV9idygpCgpHcmFwaDI8LUdyYXBoMit0aGVtZShheGlzLnRpdGxlPWVsZW1lbnRfdGV4dChzaXplID0gMTgpKQoKIyBsZWdlbmQgYXQgdG9wLWxlZnQsIGluc2lkZSB0aGUgcGxvdApTQ09ILmhyLmZpZzI8LUdyYXBoMiArIHRoZW1lKGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwKICAgICAgICAgICAgICAgbGVnZW5kLmp1c3RpZmljYXRpb249YygwLDEpLAogICAgICAgICAgICAgICBsZWdlbmQucG9zaXRpb249YygwLjA1LCAwLjk1KSwKICAgICAgICAgICAgICAgbGVnZW5kLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgICAgICAgIGxlZ2VuZC5rZXkgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgICAgICAgIGxlZ2VuZC5ib3guYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChjb2xvdXIgPSAiYmxhY2siKSkgKwogICAgICAgICAgICAgICBzY2FsZV9zaGFwZV9kaXNjcmV0ZShuYW1lICA9IiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtzPWMoIm5vbnN1YnNpZGl6ZWQiLCAic3Vic2lkaXplZCIpLAogICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscz1jKCJOb25zdWJzaWRpemVkIiwgIlN1YnNpZGl6ZWQiKSkgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVfbGluZXR5cGVfZGlzY3JldGUobmFtZSAgPSIiLAogICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrcz1jKCJub25zdWJzaWRpemVkIiwgInN1YnNpZGl6ZWQiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHM9YygiTm9uc3Vic2lkaXplZCIsICJTdWJzaWRpemVkIikpCgpTQ09ILmhyLmZpZzIKIyBkaXIuY3JlYXRlKCJvdXRwdXRzIikgIyBjcmVhdGUgYSBuZXcgZm9sZGVyIHRvIGhvbGQgdGhlIG91dHB1dCBmaWxlcwojIGdnc2F2ZSgib3V0cHV0cy9TQ19PSEJfcGxvdC5wZGYiKQpgYGAKCgoKCk92ZXJhbGwgY29tYmluZWQgMTAwJSBNQ1AgbWVhbnMgYXZlcmFnZWQgYWNyb3NzIHNleApgYGB7cn0KbGlicmFyeShSbWlzYykKTWVhbnMgPC0gc3VtbWFyeVNFKHllYXIsIG1lYXN1cmV2YXI9IkhvbWVfUmFuZ2VfMTAwbWNwIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cHZhcnM9YygiRW52aXJvbm1lbnQiKSxuYS5ybSA9IFRSVUUpCgprYWJsZShNZWFucywgZm9ybWF0ID0gInBhbmRvYyIsIGNhcHRpb24gPSAnT3ZlcmFsbCBjb21iaW5lZCAxMDAlIE1DUCBtZWFucyBhdmVyYWdlZCBhY3Jvc3Mgc2V4JykKYGBgCgoKCgoKT3ZlcmFsbCBjb21iaW5lZCA5NSUgTUNQIG1lYW5zIGF2ZXJhZ2VkIGFjcm9zcyBzZXgKYGBge3J9Ck1lYW5zLjk1bWNwIDwtIHN1bW1hcnlTRSh5ZWFyLCBtZWFzdXJldmFyPSJIb21lX1JhbmdlXzk1bWNwIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cHZhcnM9YygiRW52aXJvbm1lbnQiKSxuYS5ybSA9IFRSVUUpCk1lYW5zLjk1bWNwCmBgYAoKCgoKClNldCBwcm9qZWN0aW9uIGZvciBtYXBwaW5nCmBgYHtyfQpDUlMuU0M8LUNSUygiK3Byb2o9dXRtICt6b25lPTEyICtlbGxwcz1XR1M4NCArdW5pdHM9bSArbm9fZGVmcyIpCmBgYAoKCgoKCkZ1bmN0aW9uIGZvciBNQ1AgYW5hbHlzaXMKYGBge3IgZXZhbD1GQUxTRSwgaW5jbHVkZT1GQUxTRX0KbWNwX2FuYWx5c2lzIDwtIGZ1bmN0aW9uKGZpbGVuYW1lLCBwZXJjZW50YWdlKXsKICBkYXRhIDwtIHJlYWQuY3N2KGZpbGUgPSBmaWxlbmFtZSkKICB4IDwtIGFzLmRhdGEuZnJhbWUoZGF0YSRFQVNUSU5HKQogIHkgPC0gYXMuZGF0YS5mcmFtZShkYXRhJE5PUlRISU5HKQogIHh5IDwtIGMoeCx5KQogIGRhdGEucHJvaiA8LSBTcGF0aWFsUG9pbnRzRGF0YUZyYW1lKHh5LGRhdGEsIHByb2o0c3RyaW5nID0gQ1JTLlNDKQogIHh5IDwtIFNwYXRpYWxQb2ludHMoZGF0YS5wcm9qQGNvb3JkcykKICBtY3Aub3V0IDwtIG1jcCh4eSwgcGVyY2VudGFnZSwgdW5vdXQ9ImhhIikKICBhcmVhIDwtIGFzLmRhdGEuZnJhbWUocm91bmQobWNwLm91dEBkYXRhJGFyZWEsNCkpCiAgLnJvd05hbWVzREYoYXJlYSwgbWFrZS5uYW1lcz1UUlVFKSA8LSBkYXRhJFlFQVIKICB3cml0ZS50YWJsZShhcmVhLGZpbGU9Ik1DUF9IZWN0YXJlcy5jc3YiLAogICAgICAgICAgICAgIGFwcGVuZD1UUlVFLHNlcD0iLCIsIGNvbC5uYW1lcz1GQUxTRSwgcm93Lm5hbWVzPVRSVUUpCiAgbWNwLnBvaW50cyA8LSBjYmluZCgoZGF0YS5mcmFtZSh4eSkpLGRhdGEkWUVBUikKICBjb2xuYW1lcyhtY3AucG9pbnRzKSA8LSBjKCJ4IiwieSIsICJ5ZWFyIikKICBtY3AucG9seSA8LSBmb3J0aWZ5KG1jcC5vdXQsIHJlZ2lvbiA9ICJpZCIpCiAgdW5pdHMgPC0gZ3JpZC50ZXh0KHBhc3RlKHJvdW5kKG1jcC5vdXRAZGF0YSRhcmVhLDIpLCIgaGEiKSwgeD0wLjksICB5PTAuOTUsCiAgICAgICAgICAgICAgICAgICAgIGdwPWdwYXIoZm9udGZhY2U9NCwgY2V4PTAuOSksIGRyYXcgPSBGQUxTRSkKICBtY3AucGxvdCA8LSBnZ3Bsb3QoKSArCiAgICBnZW9tX3BvbHlnb24oZGF0YT1tY3AucG9seSwgYWVzKHg9bWNwLnBvbHkkbG9uZywgeT1tY3AucG9seSRsYXQpLCBhbHBoYT0wLjUpICsKICAgIGdlb21fcG9pbnQoZGF0YT1tY3AucG9pbnRzLCBhZXMoeD14LCB5PXkpKSArIHRoZW1lX2J3KCkgKwogICAgbGFicyh4PSJFYXN0aW5nIChtKSIsIHk9Ik5vcnRoaW5nIChtKSIsIHRpdGxlPW1jcC5wb2ludHMkeWVhcikgKwogICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIiwgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYWNlID0gImJvbGQiLCBoanVzdCA9IDAuNSkpICsKICAgIGFubm90YXRpb25fY3VzdG9tKHVuaXRzKQogIG1jcC5wbG90Cn0KYGBgCgoKRnVuY3Rpb24gb2YgTUNQIHBvbHlnb25zIHVzZWQgZm9yIG1hcHBpbmcKYGBge3IgZXZhbD1GQUxTRSwgaW5jbHVkZT1GQUxTRX0KIyBDUlMuU0M8LUNSUygiK3Byb2o9dXRtICt6b25lPTEyICtlbGxwcz1XR1M4NCArdW5pdHM9bSArbm9fZGVmcyIpCgptY3BfYW5hbHlzaXMuUE9MWSA8LSBmdW5jdGlvbihmaWxlbmFtZSwgcGVyY2VudGFnZSl7CiAgZGF0YSA8LSByZWFkLmNzdihmaWxlID0gZmlsZW5hbWUsc3RyaW5nc0FzRmFjdG9ycyA9IEZBTFNFKQogIGRhdGEuc3AgPC0gZGF0YVssIGMoIkxJWkFSRE5VTUJFUiIsICJFQVNUSU5HIiwgIk5PUlRISU5HIildCiAgY29vcmRpbmF0ZXMoZGF0YS5zcCkgPC0gYygiRUFTVElORyIsICJOT1JUSElORyIpCiAgcHJvajRzdHJpbmcoZGF0YS5zcCkgPC0gQ1JTLlNDCiAgbWNwX291dCA8LSBtY3AoZGF0YS5zcCwgcGVyY2VudGFnZSwgdW5vdXQ9ImhhIikKfQpgYGAKCgpGdW5jdGlvbiBvZiBLREUgYW5hbHlzaXMKYGBge3J9CmtkZV9hbmFseXNpcy5ocmVmLnBsb3QgPC0gZnVuY3Rpb24oZmlsZW5hbWUsIHBlcmNlbnRhZ2UpewogIGRhdGEgPC0gcmVhZC5jc3YoZmlsZSA9IGZpbGVuYW1lKQogIHggPC0gYXMuZGF0YS5mcmFtZShkYXRhJEVBU1RJTkcpCiAgeSA8LSBhcy5kYXRhLmZyYW1lKGRhdGEkTk9SVEhJTkcpCiAgeHkgPC0gYyh4LHkpCiAgZGF0YS5wcm9qIDwtIFNwYXRpYWxQb2ludHNEYXRhRnJhbWUoeHksZGF0YSwgcHJvajRzdHJpbmcgPSBDUlMuU0MpCiAgeHkgPC0gU3BhdGlhbFBvaW50cyhkYXRhLnByb2pAY29vcmRzKQogIGtkZTwta2VybmVsVUQoeHksIGg9ImhyZWYiLCBrZXJuPSJiaXZub3JtIiwgZ3JpZD0xMDAwKQogIHZlciA8LSBnZXR2ZXJ0aWNlc2hyKGtkZSwgcGVyY2VudGFnZSkKICBhcmVhIDwtIGFzLmRhdGEuZnJhbWUocm91bmQodmVyJGFyZWEsNCkpCiAgLnJvd05hbWVzREYoYXJlYSwgbWFrZS5uYW1lcz1UUlVFKSA8LSBkYXRhJExJWkFSRE5VTUJFUgogIHdyaXRlLnRhYmxlKGFyZWEsZmlsZT0iS0RFX0hlY3RhcmVzLmNzdiIsCiAgICAgICAgICAgICAgYXBwZW5kPVRSVUUsc2VwPSIsIiwgY29sLm5hbWVzPUZBTFNFLCByb3cubmFtZXM9VFJVRSkKICBrZGUucG9pbnRzIDwtIGNiaW5kKChkYXRhLmZyYW1lKGRhdGEucHJvakBjb29yZHMpKSxkYXRhJExJWkFSRE5VTUJFUikKICBjb2xuYW1lcyhrZGUucG9pbnRzKSA8LSBjKCJ4IiwieSIsImxpemFyZG51bWJlciIpCiAga2RlLnBvbHkgPC0gZm9ydGlmeSh2ZXIsIHJlZ2lvbiA9ICJpZCIpCiAgdW5pdHMgPC0gZ3JpZC50ZXh0KHBhc3RlKHJvdW5kKHZlciRhcmVhLDIpLCIgaGEiKSwgeD0wLjksICB5PTAuOTUsCiAgICAgICAgICAgICAgICAgICAgIGdwPWdwYXIoZm9udGZhY2U9NCwgY2V4PTAuOSksIGRyYXcgPSBGQUxTRSkKICBrZGUucGxvdCA8LSBnZ3Bsb3QoKSArCiAgICBnZW9tX3BvbHlnb24oZGF0YT1rZGUucG9seSwgYWVzKHg9a2RlLnBvbHkkbG9uZywgeT1rZGUucG9seSRsYXQpLCBhbHBoYSA9IDAuNSkgKwogICAgZ2VvbV9wb2ludChkYXRhPWtkZS5wb2ludHMsIGFlcyh4PXgsIHk9eSkpICsgdGhlbWVfYncoKSArCiAgICBsYWJzKHg9IkVhc3RpbmcgKG0pIiwgeT0iTm9ydGhpbmcgKG0pIiwgdGl0bGU9a2RlLnBvaW50cyRsaXphcmRudW1iZXIpICsKICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIiwgaGp1c3QgPSAwLjUpKSArCiAgICBhbm5vdGF0aW9uX2N1c3RvbSh1bml0cykKICBrZGUucGxvdAp9CmBgYAoKCkZ1bmN0aW9uIG9mIEtERSBwb2x5Z29ucyBmb3IgbWFwcGluZwpgYGB7cn0Ka2RlX2FuYWx5c2lzLmhyZWYucG9seWdvbiA8LSBmdW5jdGlvbihmaWxlbmFtZSwgcGVyY2VudGFnZSl7CiAgZGF0YSA8LSByZWFkLmNzdihmaWxlID0gZmlsZW5hbWUpCiAgeCA8LSBhcy5kYXRhLmZyYW1lKGRhdGEkRUFTVElORykKICB5IDwtIGFzLmRhdGEuZnJhbWUoZGF0YSROT1JUSElORykKICB4eSA8LSBjKHgseSkKICBkYXRhLnByb2ogPC0gU3BhdGlhbFBvaW50c0RhdGFGcmFtZSh4eSxkYXRhLCBwcm9qNHN0cmluZyA9IENSUy5TQykKICB4eSA8LSBTcGF0aWFsUG9pbnRzKGRhdGEucHJvakBjb29yZHMpCiAga2RlPC1rZXJuZWxVRCh4eSwgaD0iaHJlZiIsIGtlcm49ImJpdm5vcm0iLCBncmlkPTEwMDApCiAgdmVyIDwtIGdldHZlcnRpY2VzaHIoa2RlLCBwZXJjZW50YWdlKQogIHZlckBwcm9qNHN0cmluZzwtQ1JTLlNDCiAgYXJlYSA8LSBhcy5kYXRhLmZyYW1lKHJvdW5kKHZlciRhcmVhLDQpKQogIC5yb3dOYW1lc0RGKGFyZWEsIG1ha2UubmFtZXM9VFJVRSkgPC0gZGF0YSRZRUFSCiAgd3JpdGUudGFibGUoYXJlYSxmaWxlPSJLREVfSGVjdGFyZXMuY3N2IiwKICAgICAgICAgICAgICBhcHBlbmQ9VFJVRSxzZXA9IiwiLCBjb2wubmFtZXM9RkFMU0UsIHJvdy5uYW1lcz1UUlVFKQogIGtkZS5wb2ludHMgPC0gY2JpbmQoKGRhdGEuZnJhbWUoZGF0YS5wcm9qQGNvb3JkcykpLGRhdGEkWUVBUikKICBjb2xuYW1lcyhrZGUucG9pbnRzKSA8LSBjKCJ4IiwieSIsInllYXIiKQogIGtkZS5wb2x5IDwtIGZvcnRpZnkodmVyLCByZWdpb24gPSAiaWQiKQogIHVuaXRzIDwtIGdyaWQudGV4dChwYXN0ZShyb3VuZCh2ZXIkYXJlYSwyKSwiIGhhIiksIHg9MC45LCAgeT0wLjk1LAogICAgICAgICAgICAgICAgICAgICBncD1ncGFyKGZvbnRmYWNlPTQsIGNleD0wLjkpLCBkcmF3ID0gRkFMU0UpCiAgdmVyCn0KYGBgCgoKRnVuY3Rpb24gb2YgcmFzdGVyIG9mIFVEIApgYGB7cn0KIyBrZGVfYW5hbHlzaXMuaHJlZi5yYXN0ZXIgPC0gZnVuY3Rpb24oZmlsZW5hbWUpewojICAgZGF0YSA8LSByZWFkLmNzdihmaWxlID0gZmlsZW5hbWUpCiMgICB4IDwtIGFzLmRhdGEuZnJhbWUoZGF0YSRFQVNUSU5HKQojICAgeSA8LSBhcy5kYXRhLmZyYW1lKGRhdGEkTk9SVEhJTkcpCiMgICB4eSA8LSBjKHgseSkKIyAgIGRhdGEucHJvaiA8LSBTcGF0aWFsUG9pbnRzRGF0YUZyYW1lKHh5LGRhdGEsIHByb2o0c3RyaW5nID0gQ1JTLlNDKQojICAgeHkgPC0gU3BhdGlhbFBvaW50cyhkYXRhLnByb2pAY29vcmRzKQojICAga2RlPC1rZXJuZWxVRCh4eSwgaD0iaHJlZiIsIGtlcm49ImJpdm5vcm0iLCBncmlkPTEwMDApCiMgICBrZGU8LWFzKGtkZSwgIlNwYXRpYWxHcmlkRGF0YUZyYW1lIikKIyAgIGtkZUBwcm9qNHN0cmluZzwtIENSUy5TQwojICAga2RlCiMgfQpgYGAKCgpGdW5jdGlvbiBvZiB0cmFqZWN0b3J5IGFuYWx5c2lzIGFuZCBkaXN0YW5jZSBvdmVyIHRpbWUKYGBge3J9CnRyYWpfYW5hbHlzaXMgPC0gZnVuY3Rpb24oZmlsZW5hbWUpewogIHJlbG9jc19kYXRhIDwtIHJlYWQuY3N2KGZpbGUgPSBmaWxlbmFtZSkKICByZWxvY3MgPC0gYXMubHRyYWooY2JpbmQocmVsb2NzX2RhdGEkRUFTVElORywgcmVsb2NzX2RhdGEkTk9SVEhJTkcpLGlkPXJlbG9jc19kYXRhJExJWkFSRE5VTUJFUiwgdHlwZUlJID0gRkFMU0UsIGRhdGU9TlVMTCkKICByZWxvY3MuZGYgPC0gbGQocmVsb2NzKQogIHJlbG9jc19kaXN0IDwtIGFzLmRhdGEuZnJhbWUoc3VtKHNhcHBseShyZWxvY3MuZGYkZGlzdCwgc3VtLCBuYS5ybT1UUlVFKSkpCiAgY29sbmFtZXMocmVsb2NzX2Rpc3QpIDwtICJUb3RhbCBEaXN0YW5jZSIKICBuYW1lIDwtIHJlbG9jcy5kZiRpZFsxXQogIHJvdy5uYW1lcyhyZWxvY3NfZGlzdCkgPC0gbmFtZQogIHJlbG9jc191bml0cyA8LSBncmlkLnRleHQocGFzdGUocm91bmQocmVsb2NzX2Rpc3QsMiksIm0iKSwgeD0wLjksIHk9MC45LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3A9Z3Bhcihmb250ZmFjZT0zLCBjb2w9ImJsYWNrIiwgY2V4PTAuOSksIGRyYXcgPSBGQUxTRSkKICByZWxvYy5wbG90IDwtIGdncGxvdCgpICsgdGhlbWVfY2xhc3NpYygpICsgZ2VvbV9wYXRoKGRhdGE9cmVsb2NzLmRmLCBhZXMoeD14LHk9eSksIGxpbmV0eXBlID0gImRhc2hlZCIsIGNvbG91ciA9ICJyZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyb3cgPSBhcnJvdyhsZW5ndGg9dW5pdCguNSwiY20iKSwgYW5nbGUgPSAyMCwgZW5kcz0ibGFzdCIsIHR5cGUgPSAiY2xvc2VkIikpICsKICAgIGdlb21fcG9pbnQoZGF0YT1yZWxvY3MuZGYsIGFlcyh4PXgsIHk9eSkpICsgZ2VvbV9wb2ludChkYXRhPXJlbG9jcy5kZiwgYWVzKHg9eFsxXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHk9eVsxXSksIHNpemUgPSAzLCBjb2xvciA9ICJkYXJrZ3JlZW4iLCBwY2g9MCkgKwogICAgbGFicyh4PSJFYXN0aW5nIChtKSIsIHk9Ik5vcnRoaW5nIChtKSIsIHRpdGxlPXJlbG9jcy5kZiRpZFsxXSkgKwogICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIiwgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYWNlID0gImJvbGQiLCBoanVzdCA9IDAuNSkpICsKICAgIGFubm90YXRpb25fY3VzdG9tKHJlbG9jc191bml0cykKICByZWxvYy5wbG90Cn0KYGBgCgoKRnVuY3Rpb24gb2YgZGlzdGFuY2Ugb2YgdGltZQpgYGB7cn0KZGlzdF9hbmFseXNpcyA8LSBmdW5jdGlvbihmaWxlbmFtZSl7CiAgcmVsb2NzX2RhdGEgPC0gcmVhZC5jc3YoZmlsZSA9IGZpbGVuYW1lKQogIHJlbG9jcyA8LSBhcy5sdHJhaihjYmluZChyZWxvY3NfZGF0YSRFQVNUSU5HLCByZWxvY3NfZGF0YSROT1JUSElORyksaWQ9cmVsb2NzX2RhdGEkTElaQVJETlVNQkVSLCB0eXBlSUkgPSBGQUxTRSwgZGF0ZT1OVUxMKQogIHJlbG9jcy5kZiA8LSBsZChyZWxvY3MpCiAgcmVsb2NzX2Rpc3QgPC0gYXMuZGF0YS5mcmFtZShzdW0oc2FwcGx5KHJlbG9jcy5kZiRkaXN0LCBzdW0sIG5hLnJtPVRSVUUpKSkKICBjb2xuYW1lcyhyZWxvY3NfZGlzdCkgPC0gIlRvdGFsIERpc3RhbmNlIgogIG5hbWUgPC0gcmVsb2NzLmRmJGlkWzFdCiAgcm93Lm5hbWVzKHJlbG9jc19kaXN0KSA8LSBuYW1lCiAgd3JpdGUudGFibGUocmVsb2NzX2Rpc3QsZmlsZT0icmVsb2NfZGlzdC5jc3YiLAogICAgICAgICAgICAgIGFwcGVuZD1UUlVFLHNlcD0iLCIsIGNvbC5uYW1lcz1GQUxTRSwgcm93Lm5hbWVzPVRSVUUpCiAgZGlzdC5wbG90Cn0KYGBgCgoKTWFwIG9mIHllYXJseSBIUiBzaGlmdHMgb2YgYSBzdWJzZXQgb2YgR2lsYSBNb25zdGVycy4gSW5jbHVkZXMgcnVubmluZyBNQ1AgcG9seWdvbnMsIEZvcnRpZnkgbWNwIHBvbHlnb25zIGZvciBnZ3Bsb3QyIGJ5IFlFQVIKYGBge3J9Ck0yMTVfbWNwLjExPC1tY3BfYW5hbHlzaXMuUE9MWSgiLi9NMjE1LzIwMTEgLmNzdiIsIHBlcmNlbnRhZ2U9IDEwMCkKTTIxNV9tY3AuMTI8LW1jcF9hbmFseXNpcy5QT0xZKCIuL00yMTUvMjAxMiAuY3N2IiwgcGVyY2VudGFnZT0gMTAwKQpGMTA0X21jcC4wODwtbWNwX2FuYWx5c2lzLlBPTFkoIi4vRjEwNC8yMDA4IC5jc3YiLCBwZXJjZW50YWdlPSAxMDApCkYxMDRfbWNwLjA5PC1tY3BfYW5hbHlzaXMuUE9MWSgiLi9GMTA0LzIwMDkgLmNzdiIsIHBlcmNlbnRhZ2U9IDEwMCkKRjExNF9tY3AuMDg8LW1jcF9hbmFseXNpcy5QT0xZKCIuL0YxMTQvMjAwOCAuY3N2IiwgcGVyY2VudGFnZT0gMTAwKQpGMTE0X21jcC4wOTwtbWNwX2FuYWx5c2lzLlBPTFkoIi4vRjExNC8yMDA5IC5jc3YiLCBwZXJjZW50YWdlPSAxMDApCkYxMTRfbWNwLjEwPC1tY3BfYW5hbHlzaXMuUE9MWSgiLi9GMTE0LzIwMTAgLmNzdiIsIHBlcmNlbnRhZ2U9IDEwMCkKRjExNF9tY3AuMTE8LW1jcF9hbmFseXNpcy5QT0xZKCIuL0YxMTQvMjAxMSAuY3N2IiwgcGVyY2VudGFnZT0gMTAwKQpGMTE0X21jcC4xMjwtbWNwX2FuYWx5c2lzLlBPTFkoIi4vRjExNC8yMDEyIC5jc3YiLCBwZXJjZW50YWdlPSAxMDApCkYxMzdfbWNwLjA5PC1tY3BfYW5hbHlzaXMuUE9MWSgiLi9GMTM3LzIwMDkgLmNzdiIsIHBlcmNlbnRhZ2U9IDEwMCkKRjEzN19tY3AuMTA8LW1jcF9hbmFseXNpcy5QT0xZKCIuL0YxMzcvMjAxMCAuY3N2IiwgcGVyY2VudGFnZT0gMTAwKQpGMTM3X21jcC4xMTwtbWNwX2FuYWx5c2lzLlBPTFkoIi4vRjEzNy8yMDExIC5jc3YiLCBwZXJjZW50YWdlPSAxMDApCkYxNDdfbWNwLjA5PC1tY3BfYW5hbHlzaXMuUE9MWSgiLi9GMTQ3LzIwMDkgLmNzdiIsIHBlcmNlbnRhZ2U9IDEwMCkKRjE0N19tY3AuMTA8LW1jcF9hbmFseXNpcy5QT0xZKCIuL0YxNDcvMjAxMCAuY3N2IiwgcGVyY2VudGFnZT0gMTAwKQpGMTQ3X21jcC4xMTwtbWNwX2FuYWx5c2lzLlBPTFkoIi4vRjE0Ny8yMDExIC5jc3YiLCBwZXJjZW50YWdlPSAxMDApCkYxNDdfbWNwLjEyPC1tY3BfYW5hbHlzaXMuUE9MWSgiLi9GMTQ3LzIwMTIgLmNzdiIsIHBlcmNlbnRhZ2U9IDEwMCkKRjM2X21jcC4wODwtbWNwX2FuYWx5c2lzLlBPTFkoIi4vRjM2LzIwMDggLmNzdiIsIHBlcmNlbnRhZ2U9IDEwMCkKRjM2X21jcC4wOTwtbWNwX2FuYWx5c2lzLlBPTFkoIi4vRjM2LzIwMDkgLmNzdiIsIHBlcmNlbnRhZ2U9IDEwMCkKRjM2X21jcC4xMDwtbWNwX2FuYWx5c2lzLlBPTFkoIi4vRjM2LzIwMTAgLmNzdiIsIHBlcmNlbnRhZ2U9IDEwMCkKRjM2X21jcC4xMTwtbWNwX2FuYWx5c2lzLlBPTFkoIi4vRjM2LzIwMTEgLmNzdiIsIHBlcmNlbnRhZ2U9IDEwMCkKRjM2X21jcC4xMjwtbWNwX2FuYWx5c2lzLlBPTFkoIi4vRjM2LzIwMTIgLmNzdiIsIHBlcmNlbnRhZ2U9IDEwMCkKRjY2X21jcC4wODwtbWNwX2FuYWx5c2lzLlBPTFkoIi4vRjY2LzIwMDggLmNzdiIsIHBlcmNlbnRhZ2U9IDEwMCkKRjY2X21jcC4wOTwtbWNwX2FuYWx5c2lzLlBPTFkoIi4vRjY2LzIwMDkgLmNzdiIsIHBlcmNlbnRhZ2U9IDEwMCkKRjY2X21jcC4xMDwtbWNwX2FuYWx5c2lzLlBPTFkoIi4vRjY2LzIwMTAgLmNzdiIsIHBlcmNlbnRhZ2U9IDEwMCkKTTExOV9tY3AuMDg8LW1jcF9hbmFseXNpcy5QT0xZKCIuL00xMTkvMjAwOCAuY3N2IiwgcGVyY2VudGFnZT0gMTAwKQpNMTE5X21jcC4wOTwtbWNwX2FuYWx5c2lzLlBPTFkoIi4vTTExOS8yMDA5IC5jc3YiLCBwZXJjZW50YWdlPSAxMDApCk0xMTlfbWNwLjEwPC1tY3BfYW5hbHlzaXMuUE9MWSgiLi9NMTE5LzIwMTAgLmNzdiIsIHBlcmNlbnRhZ2U9IDEwMCkKTTExMl9tY3AuMDc8LW1jcF9hbmFseXNpcy5QT0xZKCIuL00xMTIvMjAwNyAuY3N2IiwgcGVyY2VudGFnZT0gMTAwKQpNMTEyX21jcC4wOTwtbWNwX2FuYWx5c2lzLlBPTFkoIi4vTTExMi8yMDA5IC5jc3YiLCBwZXJjZW50YWdlPSAxMDApCk0xMTJfbWNwLjEwPC1tY3BfYW5hbHlzaXMuUE9MWSgiLi9NMTEyLzIwMTAgLmNzdiIsIHBlcmNlbnRhZ2U9IDEwMCkKTTY5X21jcC4wOTwtbWNwX2FuYWx5c2lzLlBPTFkoIi4vTTY5LzIwMDkgLmNzdiIsIHBlcmNlbnRhZ2U9IDEwMCkKTTY5X21jcC4xMDwtbWNwX2FuYWx5c2lzLlBPTFkoIi4vTTY5LzIwMTAgLmNzdiIsIHBlcmNlbnRhZ2U9IDEwMCkKCiMjIEZvcnRpZnkgbWNwIHBvbHlnb25zIGZvciBnZ3Bsb3QyICpZRUFSKjoKCkYxMDRfbWNwLjA4VCA8LSBmb3J0aWZ5KEYxMDRfbWNwLjA4LCByZWdpb24gPSAiaWQiKQpGMTA0X21jcC4wOVQgPC0gZm9ydGlmeShGMTA0X21jcC4wOSwgcmVnaW9uID0gImlkIikKRjExNF9tY3AuMDhUIDwtIGZvcnRpZnkoRjExNF9tY3AuMDgsIHJlZ2lvbiA9ICJpZCIpCkYxMTRfbWNwLjA5VCA8LSBmb3J0aWZ5KEYxMTRfbWNwLjA5LCByZWdpb24gPSAiaWQiKQpGMTE0X21jcC4xMFQgPC0gZm9ydGlmeShGMTE0X21jcC4xMCwgcmVnaW9uID0gImlkIikKRjExNF9tY3AuMTFUIDwtIGZvcnRpZnkoRjExNF9tY3AuMTEsIHJlZ2lvbiA9ICJpZCIpCkYxMTRfbWNwLjEyVCA8LSBmb3J0aWZ5KEYxMTRfbWNwLjEyLCByZWdpb24gPSAiaWQiKQpGMTM3X21jcC4wOVQgPC0gZm9ydGlmeShGMTM3X21jcC4wOSwgcmVnaW9uID0gImlkIikKRjEzN19tY3AuMTBUIDwtIGZvcnRpZnkoRjEzN19tY3AuMTAsIHJlZ2lvbiA9ICJpZCIpCkYxMzdfbWNwLjExVCA8LSBmb3J0aWZ5KEYxMzdfbWNwLjExLCByZWdpb24gPSAiaWQiKQpGMTQ3X21jcC4wOVQgPC0gZm9ydGlmeShGMTQ3X21jcC4wOSwgcmVnaW9uID0gImlkIikKRjE0N19tY3AuMTBUIDwtIGZvcnRpZnkoRjE0N19tY3AuMTAsIHJlZ2lvbiA9ICJpZCIpCkYxNDdfbWNwLjExVCA8LSBmb3J0aWZ5KEYxNDdfbWNwLjExLCByZWdpb24gPSAiaWQiKQpGMTQ3X21jcC4xMlQgPC0gZm9ydGlmeShGMTQ3X21jcC4xMiwgcmVnaW9uID0gImlkIikKRjM2X21jcC4wOFQgPC0gZm9ydGlmeShGMzZfbWNwLjA4LCByZWdpb24gPSAiaWQiKQpGMzZfbWNwLjA5VCA8LSBmb3J0aWZ5KEYzNl9tY3AuMDksIHJlZ2lvbiA9ICJpZCIpCkYzNl9tY3AuMTBUIDwtIGZvcnRpZnkoRjM2X21jcC4xMCwgcmVnaW9uID0gImlkIikKRjM2X21jcC4xMVQgPC0gZm9ydGlmeShGMzZfbWNwLjExLCByZWdpb24gPSAiaWQiKQpGMzZfbWNwLjEyVCA8LSBmb3J0aWZ5KEYzNl9tY3AuMTIsIHJlZ2lvbiA9ICJpZCIpCkY2Nl9tY3AuMDhUIDwtIGZvcnRpZnkoRjY2X21jcC4wOCwgcmVnaW9uID0gImlkIikKRjY2X21jcC4wOVQgPC0gZm9ydGlmeShGNjZfbWNwLjA5LCByZWdpb24gPSAiaWQiKQpGNjZfbWNwLjEwVCA8LSBmb3J0aWZ5KEY2Nl9tY3AuMTAsIHJlZ2lvbiA9ICJpZCIpCk0xMTlfbWNwLjA4VCA8LSBmb3J0aWZ5KE0xMTlfbWNwLjA4LCByZWdpb24gPSAiaWQiKQpNMTE5X21jcC4wOVQgPC0gZm9ydGlmeShNMTE5X21jcC4wOSwgcmVnaW9uID0gImlkIikKTTExOV9tY3AuMTBUIDwtIGZvcnRpZnkoTTExOV9tY3AuMTAsIHJlZ2lvbiA9ICJpZCIpCk0xMTJfbWNwLjA3VCA8LSBmb3J0aWZ5KE0xMTJfbWNwLjA3LCByZWdpb24gPSAiaWQiKQpNMTEyX21jcC4wOVQgPC0gZm9ydGlmeShNMTEyX21jcC4wOSwgcmVnaW9uID0gImlkIikKTTExMl9tY3AuMTBUIDwtIGZvcnRpZnkoTTExMl9tY3AuMTAsIHJlZ2lvbiA9ICJpZCIpCk02OV9tY3AuMDlUIDwtIGZvcnRpZnkoTTY5X21jcC4wOSwgcmVnaW9uID0gImlkIikKTTY5X21jcC4xMFQgPC0gZm9ydGlmeShNNjlfbWNwLjEwLCByZWdpb24gPSAiaWQiKQpNMjE1X21jcC4xMVQgPC0gZm9ydGlmeShNMjE1X21jcC4xMSwgcmVnaW9uID0gImlkIikKTTIxNV9tY3AuMTJUIDwtIGZvcnRpZnkoTTIxNV9tY3AuMTIsIHJlZ2lvbiA9ICJpZCIpCgoKbWNwLnNoaWZ0LlRFU1Q0IDwtIGdncGxvdCgpICsKICAjIGdlb21fcG9seWdvbihkYXRhPUYxMDRfbWNwLjA4VCwgYWVzKHg9RjEwNF9tY3AuMDhUJGxvbmcsIHk9RjEwNF9tY3AuMDhUJGxhdCksCiAgIyAgICAgICAgICAgICAgYWxwaGE9MC4xLGNvbG91cj0iYmxhY2siLGxpbmV0eXBlPTIpICsKICAjIGdlb21fcG9seWdvbihkYXRhPUYxMDRfbWNwLjA5VCwgYWVzKHg9RjEwNF9tY3AuMDlUJGxvbmcsIHk9RjEwNF9tY3AuMDlUJGxhdCksCiAgIyAgICAgICAgICAgICAgYWxwaGE9MC4xLGNvbG91cj0iYmxhY2siLGxpbmV0eXBlPTIpICsKICBnZW9tX3BvbHlnb24oZGF0YT1GMTE0X21jcC4wOFQsIGFlcyh4PUYxMTRfbWNwLjA4VCRsb25nLCB5PUYxMTRfbWNwLjA4VCRsYXQpLAogICAgICAgICAgICAgICBhbHBoYT0wLjEsY29sb3VyPSJibGFjayIsbGluZXR5cGU9MykgKwogIGdlb21fcG9seWdvbihkYXRhPUYxMTRfbWNwLjA5VCwgYWVzKHg9RjExNF9tY3AuMDlUJGxvbmcsIHk9RjExNF9tY3AuMDlUJGxhdCksCiAgICAgICAgICAgICAgIGFscGhhPTAuMSxjb2xvdXI9ImJsYWNrIixsaW5ldHlwZT0zKSArCiAgZ2VvbV9wb2x5Z29uKGRhdGE9RjExNF9tY3AuMTBULCBhZXMoeD1GMTE0X21jcC4xMFQkbG9uZywgeT1GMTE0X21jcC4xMFQkbGF0KSwKICAgICAgICAgICAgICAgYWxwaGE9MC4xLGNvbG91cj0iYmxhY2siLGxpbmV0eXBlPTMpICsKICBnZW9tX3BvbHlnb24oZGF0YT1GMTE0X21jcC4xMVQsIGFlcyh4PUYxMTRfbWNwLjExVCRsb25nLCB5PUYxMTRfbWNwLjExVCRsYXQpLAogICAgICAgICAgICAgICBhbHBoYT0wLjEsY29sb3VyPSJibGFjayIsbGluZXR5cGU9MykgKwogIGdlb21fcG9seWdvbihkYXRhPUYxMTRfbWNwLjEyVCwgYWVzKHg9RjExNF9tY3AuMTJUJGxvbmcsIHk9RjExNF9tY3AuMTJUJGxhdCksCiAgICAgICAgICAgICAgIGFscGhhPTAuMSxjb2xvdXI9ImJsYWNrIixsaW5ldHlwZT0zKSArCiAgZ2VvbV9wb2x5Z29uKGRhdGE9RjEzN19tY3AuMDlULCBhZXMoeD1GMTM3X21jcC4wOVQkbG9uZywgeT1GMTM3X21jcC4wOVQkbGF0KSwKICAgICAgICAgICAgICAgYWxwaGE9MC4xLGNvbG91cj0iYnJvd24iLGxpbmV0eXBlPTQpICsKICBnZW9tX3BvbHlnb24oZGF0YT1GMTM3X21jcC4xMFQsIGFlcyh4PUYxMzdfbWNwLjEwVCRsb25nLCB5PUYxMzdfbWNwLjEwVCRsYXQpLAogICAgICAgICAgICAgICBhbHBoYT0wLjEsY29sb3VyPSJicm93biIsbGluZXR5cGU9NCkgKwogIGdlb21fcG9seWdvbihkYXRhPUYxMzdfbWNwLjExVCwgYWVzKHg9RjEzN19tY3AuMTFUJGxvbmcsIHk9RjEzN19tY3AuMTFUJGxhdCksCiAgICAgICAgICAgICAgIGFscGhhPTAuMSxjb2xvdXI9ImJyb3duIixsaW5ldHlwZT00KSArCiAgZ2VvbV9wb2x5Z29uKGRhdGE9RjE0N19tY3AuMDlULCBhZXMoeD1GMTQ3X21jcC4wOVQkbG9uZywgeT1GMTQ3X21jcC4wOVQkbGF0KSwKICAgICAgICAgICAgICAgYWxwaGE9MC4xLGNvbG91cj0icmVkIixsaW5ldHlwZT0xKSArCiAgZ2VvbV9wb2x5Z29uKGRhdGE9RjE0N19tY3AuMTBULCBhZXMoeD1GMTQ3X21jcC4xMFQkbG9uZywgeT1GMTQ3X21jcC4xMFQkbGF0KSwKICAgICAgICAgICAgICAgYWxwaGE9MC4xLGNvbG91cj0icmVkIixsaW5ldHlwZT0xKSArCiAgZ2VvbV9wb2x5Z29uKGRhdGE9RjE0N19tY3AuMTFULCBhZXMoeD1GMTQ3X21jcC4xMVQkbG9uZywgeT1GMTQ3X21jcC4xMVQkbGF0KSwKICAgICAgICAgICAgICAgYWxwaGE9MC4xLGNvbG91cj0icmVkIixsaW5ldHlwZT0xKSArCiAgZ2VvbV9wb2x5Z29uKGRhdGE9RjE0N19tY3AuMTJULCBhZXMoeD1GMTQ3X21jcC4xMlQkbG9uZywgeT1GMTQ3X21jcC4xMlQkbGF0KSwKICAgICAgICAgICAgICAgYWxwaGE9MC4xLGNvbG91cj0icmVkIixsaW5ldHlwZT0xKSArCiAgIyBnZW9tX3BvbHlnb24oZGF0YT1GMzZfbWNwLjA4VCwgYWVzKHg9RjM2X21jcC4wOFQkbG9uZywgeT1GMzZfbWNwLjA4VCRsYXQpLAogICMgICAgICAgICAgICAgIGFscGhhPTAuMSxjb2xvdXI9ImJsYWNrIixsaW5ldHlwZT02KSArCiAgIyBnZW9tX3BvbHlnb24oZGF0YT1GMzZfbWNwLjA5VCwgYWVzKHg9RjM2X21jcC4wOVQkbG9uZywgeT1GMzZfbWNwLjA5VCRsYXQpLAogICMgICAgICAgICAgICAgIGFscGhhPTAuMSxjb2xvdXI9ImJsYWNrIixsaW5ldHlwZT02KSArCiAgIyBnZW9tX3BvbHlnb24oZGF0YT1GMzZfbWNwLjEwVCwgYWVzKHg9RjM2X21jcC4xMFQkbG9uZywgeT1GMzZfbWNwLjEwVCRsYXQpLAogICMgICAgICAgICAgICAgIGFscGhhPTAuMSxjb2xvdXI9ImJsYWNrIixsaW5ldHlwZT02KSArCiAgIyBnZW9tX3BvbHlnb24oZGF0YT1GMzZfbWNwLjExVCwgYWVzKHg9RjM2X21jcC4xMVQkbG9uZywgeT1GMzZfbWNwLjExVCRsYXQpLAogICMgICAgICAgICAgICAgIGFscGhhPTAuMSxjb2xvdXI9ImJsYWNrIixsaW5ldHlwZT02KSArCiAgIyBnZW9tX3BvbHlnb24oZGF0YT1GMzZfbWNwLjEyVCwgYWVzKHg9RjM2X21jcC4xMlQkbG9uZywgeT1GMzZfbWNwLjEyVCRsYXQpLAogICMgICAgICAgICAgICAgIGFscGhhPTAuMSxjb2xvdXI9ImJsYWNrIixsaW5ldHlwZT02KSArCiAgZ2VvbV9wb2x5Z29uKGRhdGE9RjY2X21jcC4wOFQsIGFlcyh4PUY2Nl9tY3AuMDhUJGxvbmcsIHk9RjY2X21jcC4wOFQkbGF0KSwKICAgICAgICAgICAgICAgYWxwaGE9MC4xLGNvbG91cj0iZ3JlZW4iLGxpbmV0eXBlPTUpICsKICBnZW9tX3BvbHlnb24oZGF0YT1GNjZfbWNwLjA5VCwgYWVzKHg9RjY2X21jcC4wOVQkbG9uZywgeT1GNjZfbWNwLjA5VCRsYXQpLAogICAgICAgICAgICAgICBhbHBoYT0wLjEsY29sb3VyPSJncmVlbiIsbGluZXR5cGU9NSkgKwogIGdlb21fcG9seWdvbihkYXRhPUY2Nl9tY3AuMTBULCBhZXMoeD1GNjZfbWNwLjEwVCRsb25nLCB5PUY2Nl9tY3AuMTBUJGxhdCksCiAgICAgICAgICAgICAgIGFscGhhPTAuMSxjb2xvdXI9ImdyZWVuIixsaW5ldHlwZT01KSArCiAgZ2VvbV9wb2x5Z29uKGRhdGE9TTExOV9tY3AuMDhULCBhZXMoeD1NMTE5X21jcC4wOFQkbG9uZywgeT1NMTE5X21jcC4wOFQkbGF0KSwKICAgICAgICAgICAgICAgYWxwaGE9MC4xLGNvbG91cj0iYmx1ZSIsbGluZXR5cGU9NikgKwogIGdlb21fcG9seWdvbihkYXRhPU0xMTlfbWNwLjA5VCwgYWVzKHg9TTExOV9tY3AuMDlUJGxvbmcsIHk9TTExOV9tY3AuMDlUJGxhdCksCiAgICAgICAgICAgICAgIGFscGhhPTAuMSxjb2xvdXI9ImJsdWUiLGxpbmV0eXBlPTYpICsKICBnZW9tX3BvbHlnb24oZGF0YT1NMTE5X21jcC4xMFQsIGFlcyh4PU0xMTlfbWNwLjEwVCRsb25nLCB5PU0xMTlfbWNwLjEwVCRsYXQpLAogICAgICAgICAgICAgICBhbHBoYT0wLjEsY29sb3VyPSJibHVlIixsaW5ldHlwZT02KSArCiAgZ2VvbV9wb2x5Z29uKGRhdGE9TTExMl9tY3AuMDdULCBhZXMoeD1NMTEyX21jcC4wN1QkbG9uZywgeT1NMTEyX21jcC4wN1QkbGF0KSwKICAgICAgICAgICAgICAgYWxwaGE9MC4xLGNvbG91cj0icHVycGxlIixsaW5ldHlwZT0yKSArCiAgZ2VvbV9wb2x5Z29uKGRhdGE9TTExMl9tY3AuMDlULCBhZXMoeD1NMTEyX21jcC4wOVQkbG9uZywgeT1NMTEyX21jcC4wOVQkbGF0KSwKICAgICAgICAgICAgICAgYWxwaGE9MC4xLGNvbG91cj0icHVycGxlIixsaW5ldHlwZT0yKSArCiAgZ2VvbV9wb2x5Z29uKGRhdGE9TTExMl9tY3AuMTBULCBhZXMoeD1NMTEyX21jcC4xMFQkbG9uZywgeT1NMTEyX21jcC4xMFQkbGF0KSwKICAgICAgICAgICAgICAgYWxwaGE9MC4xLGNvbG91cj0icHVycGxlIixsaW5ldHlwZT0yKSArCiAgIyBnZW9tX3BvbHlnb24oZGF0YT1NNjlfbWNwLjA5VCwgYWVzKHg9TTY5X21jcC4wOVQkbG9uZywgeT1NNjlfbWNwLjA5VCRsYXQpLAogICMgICAgICAgICAgICAgIGFscGhhPTAuMSxjb2xvdXI9ImJsYWNrIikgKwogICMgZ2VvbV9wb2x5Z29uKGRhdGE9TTY5X21jcC4xMFQsIGFlcyh4PU02OV9tY3AuMTBUJGxvbmcsIHk9TTY5X21jcC4xMFQkbGF0KSwKICAjICAgICAgICAgICAgICBhbHBoYT0wLjEsY29sb3VyPSJibGFjayIpICsKICAjIGdlb21fcG9seWdvbihkYXRhPU0yMTVfbWNwLjExVCwgYWVzKHg9TTIxNV9tY3AuMTFUJGxvbmcsIHk9TTIxNV9tY3AuMTFUJGxhdCksCiAgIyAgICAgICAgICAgICAgYWxwaGE9MC4xLGNvbG91cj0iYmxhY2siKSArCiAgIyBnZW9tX3BvbHlnb24oZGF0YT1NMjE1X21jcC4xMlQsIGFlcyh4PU0yMTVfbWNwLjEyVCRsb25nLCB5PU0yMTVfbWNwLjEyVCRsYXQpLAogICMgICAgICAgICAgICAgIGFscGhhPTAuMSxjb2xvdXI9ImJsYWNrIikgKwogIHRoZW1lX2J3KCkgK2xhYnMoeD0iRWFzdGluZyAobSkiLCB5PSJOb3J0aGluZyAobSkiKQogICMgbGFicyhjYXB0aW9uID0gIkZpZ3VyZSA1ICB8ICBTQyBZZWFybHkgaG9tZSByYW5nZSBzaGlmdHMgb2YgOCBsaXphcmRzLCBib3RoIG1hbGVzIGFuZCBmZW1hbGVzLiBIb21lIHJhbmdlIHNoaWZ0cyBhcHBlYXIgdG8gYmUgXG4gcmVsYXRpdmxleSBzdGFibGUgb3ZlciBzdHVkeSB5ZWFycy4iKSsKICAjIHRoZW1lKHBsb3QuY2FwdGlvbiA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAsbGluZWhlaWdodCA9IDAuOSkpCiAgIyB0aGVtZShsZWdlbmQucG9zaXRpb249Im5vbmUiLCBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiYm9sZCIsIGhqdXN0ID0gMC41KSkKIyMgd2l0aGluIGVhY2ggZ2VvbV9wb2x5Z29uIGxpbmU/OgojIyBhZXMoY29sb3VyPSJyZWQib3IiTTExMl9tY3AuMDlUIikuLi4rc2NhbGVfY29sb3JfbWFudWFsKG5hbWU9IiIsYnJlYWtzPWMoIiIsIiIsLi4uIiIpKSsKIyMgdmFsdWVzPWMoIiI9IiIsLi4uKQoKbWNwLnNoaWZ0LlRFU1Q0CmBgYAoKCgoKClJhdyBncm91cCAxMDAlIE1DUCBob21lIHJhbmdlIG1lYW5zIG9mIFN0b25lIENhbnlvbiBhbmQgT3dsIEhlYWQgQnV0dGVzLiBHcm91cGVkIGJ5IGVudmlyb25tZW50IGFuZCBzZXgKYGBge3J9CmxpYnJhcnkoUm1pc2MpCllSX0dSUF9NZWFucyA8LSBzdW1tYXJ5U0UoeWVhciwgbWVhc3VyZXZhcj0iSG9tZV9SYW5nZV8xMDBtY3AiLAogICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwdmFycz1jKCJFbnZpcm9ubWVudCIsIlNleCIpLG5hLnJtID0gVFJVRSkKCmthYmxlKFlSX0dSUF9NZWFucywgZm9ybWF0ID0gInBhbmRvYyIsIAogICAgICBjYXB0aW9uID0gJ1RhYmxlIDEgfCBSYXcgZ3JvdXAgMTAwJSBNQ1AgaG9tZSByYW5nZSBtZWFucyBvZiBTdG9uZSBDYW55b24gYW5kIE93bCBIZWFkIEJ1dHRlcy4gR3JvdXBlZCBieSBlbnZpcm9ubWVudCBhbmQgc2V4LicpCmBgYAoKCgoKUmF3IGdyb3VwIDk1JSBNQ1AgaG9tZSByYW5nZSBtZWFucyBvZiBTdG9uZSBDYW55b24gYW5kIE93bCBIZWFkIEJ1dHRlcy4gR3JvdXBlZCBieSBlbnZpcm9ubWVudCBhbmQgc2V4CmBgYHtyfQpZUl9HUlBfTWVhbnM5NSA8LSBzdW1tYXJ5U0UoeWVhciwgbWVhc3VyZXZhcj0iSG9tZV9SYW5nZV85NW1jcCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cHZhcnM9YygiRW52aXJvbm1lbnQiLCJTZXgiKSxuYS5ybSA9IFRSVUUpCgprYWJsZShZUl9HUlBfTWVhbnM5NSwgZm9ybWF0ID0gInBhbmRvYyIsIGNhcHRpb24gPSAnVGFibGUgMiB8IFJhdyBncm91cCA5NSUgTUNQIGhvbWUgcmFuZ2UgbWVhbnMgb2YgcmF3IGRhdGEgb2YgU3RvbmUgQ2FueW9uIGFuZCBPd2wgSGVhZCBCdXR0ZXMuIEdyb3VwZWQgYnkgZW52aXJvbm1lbnQgYW5kIHNleC4nKQpgYGAKCgoKClJNLUFOT1ZBIGZvciAxMDAlIE1DUCBhbmFseXNlcyBiZXR3ZWVuIHRoZSBzdWJzaWRpemVkIGFuZCBub24tc3Vic2lkaXplZApgYGB7cn0KIyBHZXQgcC12YWx1ZXMgZnJvbSBtaXhlZCBtb2RlbCBGIHZhbHVlczoKbGlicmFyeShsbWU0KQpsaWJyYXJ5KHJlYWRyKQp5ZWFyIDwtIHJlYWRfY3N2KCJHTV9Db25zb2xpZGF0ZWRfQnlZZWFyLmNzdiIpCgpSTW1vZC55ZWFyPC1sbWVyKEhvbWVfUmFuZ2VfMTAwbWNwfkVudmlyb25tZW50K1llYXIrU2V4K04xMDArRW52aXJvbm1lbnQqU2V4KwogICAgICAgICAgICAgICAgICAgKDF8R2lsYSksZGF0YSA9IHllYXIpCnN1bW1hcnkoUk1tb2QueWVhcikKYGBgCgoKQU5PVkEgdGFibGUgZm9yIDEwMCUgTUNQcyBiZXR3ZWVuIHRoZSB0d28gcG9wdWxhdGlvbnMKYGBge3J9CmFub3ZhKFJNbW9kLnllYXIpCmBgYAoKCgoKClJNLUFOT1ZBIGZvciA5NSUgTUNQIGFuYWx5c2VzIGJldHdlZW4gdGhlIHN1YnNpZGl6ZWQgYW5kIG5vbi1zdWJzaWRpemVkCmBgYHtyfQpSTW1vZC55ZWFyOTU8LWxtZXIoSG9tZV9SYW5nZV85NW1jcH5FbnZpcm9ubWVudCtZZWFyK1NleCtOOTUrRW52aXJvbm1lbnQqU2V4KwogICAgICAgICAgICAgICAgICAgKDF8R2lsYSksZGF0YSA9IHllYXIpCnN1bW1hcnkoUk1tb2QueWVhcjk1KQpgYGAKCgpBTk9WQSB0YWJsZSBmb3IgOTUlIE1DUHMgYmV0d2VlbiB0aGUgdHdvIHBvcHVsYXRpb25zCmBgYHtyfQphbm92YShSTW1vZC55ZWFyOTUpCmBgYAoKCgoKClJhdyBncm91cCBtZWFucyBBTkQgYWRqdXN0ZWQgRU1NcyBvZiBZZWFybHkgT3ZlcmFsbCAxMDAlTUNQCmBgYHtyfQpSTW1vZC55ZWFyMTAwPC1sbWVyKEhvbWVfUmFuZ2VfMTAwbWNwfkVudmlyb25tZW50K1llYXIrU2V4K04xMDArRW52aXJvbm1lbnQqU2V4KygxfEdpbGEpLGRhdGEgPSB5ZWFyKQoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgRU1NcyBhZGp1c3RlZCAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKUk0ubWFyZ2luYWwgPC0gbHNtZWFucyhSTW1vZC55ZWFyMTAwLCAKICAgICAgICAgICAgICAgICAgICB+IEVudmlyb25tZW50KQojIFJNLm1hcmdpbmFsIDwtIGxzbWVhbnMoUk1tb2QueWVhcjEwMCwgCiMgICAgICAgICAgICAgICAgICAgICB+IFNleCkKCiMjIENBVEFHT1JJWkUgTFNNIEdSQVBIIEJZIFNFWCBCRVRXRUVOIEVOVklST05NRU5UOgpyZWZSTV9zZXggPC0gbHNtZWFucyhSTW1vZC55ZWFyMTAwLCBzcGVjcyA9IGMoIkVudmlyb25tZW50IiwiU2V4IikpCgojIHJlZlJNX3NleApyZWZfZGZSTV9zZXggPC0gYXMuZGF0YS5mcmFtZShzdW1tYXJ5KHJlZlJNX3NleCkpCnBkX1JNIDwtIHBvc2l0aW9uX2RvZGdlKDAuMSkKCnlyLm1lYW4uYWRqPC1nZ3Bsb3QocmVmX2RmUk1fc2V4LCBhZXMoeD1TZXgseT1sc21lYW4sZ3JvdXA9RW52aXJvbm1lbnQpKSsKICBnZW9tX3BvaW50KGFlcyhzaGFwZSA9IGZhY3RvcihFbnZpcm9ubWVudCkpLCBzaXplID0gNCxwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSguMSksIAogICAgICAgICAgICBzaG93LmxlZ2VuZCA9IEZBTFNFKSsKICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzPWMoMSwgMikpKwogIGdlb21fZXJyb3JiYXIoYWVzKHltaW49bHNtZWFuLVNFLCB5bWF4PWxzbWVhbitTRSksIHdpZHRoPS4xLHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKCkpKwogIGdlb21fbGluZShwb3NpdGlvbj1wZF9STSxhZXMobGluZXR5cGU9RW52aXJvbm1lbnQpLCBzaG93LmxlZ2VuZD1GQUxTRSkgKwogIHRoZW1lX2J3KCkgICsKICB4bGFiKCIiKSArCiAgeWxhYigiIikgKwogICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSBjKC44NywuODUpLCBsZWdlbmQuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChjb2xvdXIgPSAiYmxhY2siKSwKICAgICAgICBheGlzLnRleHQueD1lbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50ZXh0LnkgID0gZWxlbWVudF90ZXh0KHZqdXN0PTAuNSwgc2l6ZT0xMiksCiAgICAgICAgYXhpcy50aXRsZS55ICA9IGVsZW1lbnRfdGV4dChzaXplPTE4KSwKICAgICAgICBheGlzLnRpdGxlLnggID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiwgZmFjZSA9ICJib2xkIiksCiAgICAgICAgYXhpcy50aWNrcy54PWVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemU9MTIpKSAKCnlyLm1lYW4uYWRqCgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBSYXcgR3JvdXAgTWVhbnMgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIHBkX1JNIDwtIHBvc2l0aW9uX2RvZGdlKDAuMSkKClJhdy5ZZWFySFI8LWdncGxvdChZUl9HUlBfTWVhbnMsIGFlcyh4PVNleCx5PUhvbWVfUmFuZ2VfMTAwbWNwLGdyb3VwPUVudmlyb25tZW50KSkrCiAgZ2VvbV9wb2ludChhZXMoc2hhcGUgPSBmYWN0b3IoRW52aXJvbm1lbnQpKSwgc2l6ZSA9IDQscG9zaXRpb249cG9zaXRpb25fZG9kZ2UoLjEpKSsKICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluPUhvbWVfUmFuZ2VfMTAwbWNwLXNlLCB5bWF4PUhvbWVfUmFuZ2VfMTAwbWNwK3NlKSwKICAgICAgICAgICAgICAgIHdpZHRoPS4xLHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKCkpKwogIGdlb21fbGluZShwb3NpdGlvbj1wZF9STSxhZXMobGluZXR5cGU9RW52aXJvbm1lbnQpLCBzaG93LmxlZ2VuZD1GQUxTRSkgKwogIHRoZW1lX2J3KCkrCiAgeGxhYigiIikrCiAgeWxhYigiMTAwJSBNQ1AgQXJlYSAoaGEpIikgKwogICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSBjKC44NywuODUpLCBsZWdlbmQuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChjb2xvdXIgPSAiYmxhY2siKSwKICAgICAgICBheGlzLnRleHQueD1lbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50ZXh0LnkgID0gZWxlbWVudF90ZXh0KHZqdXN0PTAuNSwgc2l6ZT0xMiksCiAgICAgICAgYXhpcy50aXRsZS55ICA9IGVsZW1lbnRfdGV4dChzaXplPTE4KSwKICAgICAgICBheGlzLnRpdGxlLnggID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiwgZmFjZSA9ICJib2xkIiksCiAgICAgICAgYXhpcy50aWNrcy54PWVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemU9MTIpKSAKCgpSYXcuWWVhckhSPC1SYXcuWWVhckhSICsgdGhlbWUobGVnZW5kLnRpdGxlID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgICAgICAgICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLAogICAgICAgICAgICAgICAgICAgICBsZWdlbmQuanVzdGlmaWNhdGlvbj1jKDAsMSksCiAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC5wb3NpdGlvbj1jKDAuMDUsIDAuOTUpLAogICAgICAgICAgICAgICAgICAgICBsZWdlbmQuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAgICAgICAgICAgICAgbGVnZW5kLmtleSA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAgICAgICAgICAgICAgbGVnZW5kLmJveC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGNvbG91ciA9ICJibGFjayIpKSArCiAgIHNjYWxlX3NoYXBlX2Rpc2NyZXRlKG5hbWUgID0iIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBicmVha3M9Yygibm9uc3Vic2lkaXplZCIsICJzdWJzaWRpemVkIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzPWMoIk5vbnN1YnNpZGl6ZWQiLCAiU3Vic2lkaXplZCIpKQoKUmF3LlllYXJIUgoKbGlicmFyeShnZ3B1YnIpCmxpYnJhcnkoZ3JpZEV4dHJhKQpsaWJyYXJ5KGdyaWQpCgojIGdyaWQuYXJyYW5nZShSYXcuWWVhckhSLCB5ci5tZWFuLmFkaiwgbnJvdyA9IDEsICAKIyAgICAgICAgICAgICAgYm90dG9tID0gdGV4dEdyb2IoIkZpZ3VyZSA1IHwgYS4gUmF3IGdyb3VwIG1lYW5zIG9mIG92ZXJhbGwgeWVhcmx5IGhvbWUgcmFuZ2VzIGJldHdlZW4gbWFsZXMgYW5kIGZlbWFsZXMuIE5vdGUgdGhhdCB0aGUgbWFsZSBcbiBob21lIHJhbmdlIG9mIHRoZSBzdWJzaWRpemVkIHBvcHVsYXRpb24gaXMgc21hbGxlciB0aGFuIHRoYXQgb2YgdGhlIGZlbWFsZSBob21lIHJhbmdlIGluIHRoZSBub24tc3Vic2lkaXplZCBcbiBwb3B1bGF0aW9uLiBiLiBHcm91cCBtZWFucyBvZiBob21lIHJhbmdlcyBhZnRlciBiZWluZyBhZGp1c3RlZCBmb3IgZW52aXJvbm1lbnQsIHllYXIsIHNleCwgYW5kIHNhbXBsZSBzaXplLiIsCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdwID0gZ3Bhcihmb250ZmFjZSA9IDEsZm9udHNpemUgPSAxMCksaGp1c3QgPSAwLCB4ID0gMCkpCgojIGdyaWQuYXJyYW5nZShSYXcuWWVhckhSLCB5ci5tZWFuLmFkaiwgbnJvdyA9IDEpCiMgZ3JpZC5hcnJhbmdlKFJhdy5ZZWFySFIsIHlyLm1lYW4uYWRqLCBucm93ID0gMSkKIyBnZ2FycmFuZ2UoUmF3LlllYXJIUiwgeXIubWVhbi5hZGosIGxhYmVscyA9IGMoIkEiLCAiQiIpLAojICAgICAgICAgICBuY29sID0gMikKYGBgCgoKCgoKCkRpcmVjdGlvbmFsIG1lYW5zIG9mIGhvbWUgcmFuZ2UgKDEwMCUgTUNQKSBhZnRlciBiZWluZyBhZGp1c3RlZCBmb3IgeWVhciwgc2V4IGFuZCBzYW1wbGUgc2l6ZQpgYGB7cn0Ka2FibGUocmVmX2RmUk1fc2V4LCBmb3JtYXQgPSAicGFuZG9jIiwgY2FwdGlvbiA9ICdUYWJsZSB8IERpcmVjdGlvbmFsIG1lYW5zIG9mIGhvbWUgcmFuZ2UgKDEwMCUgTUNQKSBhZnRlciBiZWluZyBhZGp1c3RlZCBmb3IgeWVhciwgc2V4IGFuZCBzYW1wbGUgc2l6ZS4nKQpgYGAKCgpgYGB7cn0KUk0uOTVLREVtb2QueWVhcjwtbG1lcihIb21lX1JhbmdlXzk1a2RlfkVudmlyb25tZW50K1llYXIrU2V4K04rRW52aXJvbm1lbnQqU2V4KwogICAgICAgICAgICAgICAgICAgICAgICAgKDF8R2lsYSksZGF0YSA9IHllYXIpCgpzdW1tYXJ5KFJNLjk1S0RFbW9kLnllYXIpCmBgYAoKYGBge3J9CmFub3ZhKFJNLjk1S0RFbW9kLnllYXIpCmBgYAoKClJNLUFOT1ZBIG9mIDk1JSBLREVzIGZvciB0aGUgc3Vic2lkaXplZCBwb3B1bGF0aW9uCmBgYHtyfQpSTS5LREVtb2QueWVhcjwtbG1lcihIb21lX1JhbmdlXzk1a2RlflllYXIrU2V4K04rKDF8R2lsYSksZGF0YSA9IHN1YikKCnN1bW1hcnkoUk0uS0RFbW9kLnllYXIpCmBgYAoKQU5PVkEgVGFibGUgZm9yIDk1JUtERQpgYGB7cn0KYW5vdmEoUk0uS0RFbW9kLnllYXIpCmBgYAoKCgoKUk0tQU5PVkEgb2YgNTAlIEtERXMgZm9yIHRoZSBzdWJzaWRpemVkCmBgYHtyfQpSTS5LREUuNTAubW9kLnllYXI8LWxtZXIoSG9tZV9SYW5nZV81MGtkZX5ZZWFyK1NleCtOKygxfEdpbGEpLGRhdGEgPSBzdWIpCgpzdW1tYXJ5KFJNLktERS41MC5tb2QueWVhcikKYGBgCgpBTk9WQSBUYWxiZSBvZiA1MCUgIEtERSBmb3IgdGhlIHN1YnNpZGl6ZWQKYGBge3J9CmFub3ZhKFJNLktERS41MC5tb2QueWVhcikKYGBgCgoKCgpUQUJMRS4gUmF3IEdyb3VwIDUwJSBLREUgaG9tZSByYW5nZSBtZWFucyBtYWxlIGFuZCBmZW1hbGUgaG9tZSByYW5nZXMgYXQgU3RvbmUgQ2FueW9uCmBgYHtyfQpZUl9HUlBfTWVhbnMuNTBLREUgPC0gc3VtbWFyeVNFKHN1YiwgbWVhc3VyZXZhcj0iSG9tZV9SYW5nZV81MGtkZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cHZhcnM9YygiU2V4IiksbmEucm0gPSBUUlVFKQoKa2FibGUoWVJfR1JQX01lYW5zLjUwS0RFLCBmb3JtYXQgPSAicGFuZG9jIiwgY2FwdGlvbiA9ICdUYWJsZSA1IHwgUmF3IEdyb3VwIDUwJSBLREUgaG9tZSByYW5nZSBtZWFucyBtYWxlIGFuZCBmZW1hbGUgaG9tZSByYW5nZXMgYXQgU3RvbmUgQ2FueW9uLicpCmBgYAoKCgoKUmF3IGdyb3VwIG1lYW5zIEFORCBhZGp1c3RlZCBFTU1zIG9mIFllYXJseSBPdmVyYWxsIDk1JSBLREVzIGJldHdlZW4gbm9uL3N1YnNpZGl6ZWQgcG9wdWxhdGlvbnMKYGBge3J9ClJNbW9kLjk1a2RlPC1sbWVyKEhvbWVfUmFuZ2VfOTVrZGV+RW52aXJvbm1lbnQrWWVhcitTZXgrTitFbnZpcm9ubWVudCpTZXgrKDF8R2lsYSksZGF0YSA9IHllYXIpCgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEVNTXMgb2YgOTUlIEtERXMgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgpSTS5tYXJnaW5hbCA8LSBsc21lYW5zKFJNbW9kLjk1a2RlLCAKICAgICAgICAgICAgICAgICAgICAgICB+IEVudmlyb25tZW50KQoKIyMgQ0FUQUdPUklaRSBMU00gR1JBUEggQlkgU0VYIEJFVFdFRU4gRU5WSVJPTk1FTlQ6CnJlZlJNX2tkZSA8LSBsc21lYW5zKFJNbW9kLjk1a2RlLCBzcGVjcyA9IGMoIkVudmlyb25tZW50IiwiU2V4IikpCgojIHJlZlJNX3NleApyZWZfZGZSTV9rZGUgPC0gYXMuZGF0YS5mcmFtZShzdW1tYXJ5KHJlZlJNX2tkZSkpCiMgcGRfUk0gPC0gcG9zaXRpb25fZG9kZ2UoMC4xKQoKa2RlLm1lYW4uYWRqPC1nZ3Bsb3QocmVmX2RmUk1fa2RlLCBhZXMoeD1TZXgseT1sc21lYW4sZ3JvdXA9RW52aXJvbm1lbnQpKSsKICBnZW9tX3BvaW50KGFlcyhzaGFwZSA9IGZhY3RvcihFbnZpcm9ubWVudCkpLCBzaXplID0gNCxwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSguMSksIAogICAgICAgICAgICAgc2hvdy5sZWdlbmQgPSBGQUxTRSkrCiAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcz1jKDEsIDIpKSsKICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluPWxzbWVhbi1TRSwgeW1heD1sc21lYW4rU0UpLCB3aWR0aD0uMSxwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSgpKSsKICBnZW9tX2xpbmUocG9zaXRpb249cGRfUk0sYWVzKGxpbmV0eXBlPUVudmlyb25tZW50KSwgc2hvdy5sZWdlbmQ9RkFMU0UpICsKICB0aGVtZV9idygpKwogIHhsYWIoIiIpKwogIHlsYWIoIiIpKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9IGMoLjg3LC44NSksIGxlZ2VuZC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGNvbG91ciA9ICJibGFjayIpLAogICAgICAgIGF4aXMudGV4dC54ICA9IGVsZW1lbnRfdGV4dCh2anVzdD0wLjUsIHNpemU9MTYpLAogICAgICAgIGF4aXMudGV4dC55ICA9IGVsZW1lbnRfdGV4dCh2anVzdD0wLjUsIHNpemU9MTIpLAogICAgICAgIGF4aXMudGl0bGUueSAgPSBlbGVtZW50X3RleHQoc2l6ZT0xOCksCiAgICAgICAgYXhpcy50aXRsZS54ICA9IGVsZW1lbnRfdGV4dChzaXplPTE4KSwKICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIsIGZhY2UgPSAiYm9sZCIpLAogICAgICAgIHN0cmlwLnRleHQgPSBlbGVtZW50X2JsYW5rKCkpICsKICBzY2FsZV94X2Rpc2NyZXRlKGxhYmVscz1jKCJGZW1hbGUiLCAiTWFsZSIpKSAKCmtkZS5tZWFuLmFkajwta2RlLm1lYW4uYWRqICsgeWxpbSgwLDkwKQprZGUubWVhbi5hZGoKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgcmF3IEVNTXMgb2YgOTUlIEtERXMgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgcG9zaXRpb249cGRfUk0sIGxpbmV0eXBlPWMoImRvdGRhc2giLCAic29saWQiKQojIHBkX1JNIDwtIHBvc2l0aW9uX2RvZGdlKDAuMSkKCiMgZ2VvbV9saW5lKHBvc2l0aW9uPXBkKSsKClJhdy5rZGU8LWdncGxvdChZUl9NZWFucy45NUtERWFsbCwgYWVzKHg9U2V4LHk9SG9tZV9SYW5nZV85NWtkZSxncm91cD1FbnZpcm9ubWVudCkpICsKICBnZW9tX3BvaW50KGFlcyhzaGFwZSA9IGZhY3RvcihFbnZpcm9ubWVudCkpLCBzaXplID0gNCxwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSguMSksCiAgICAgICAgICAgICBzaG93LmxlZ2VuZCA9IEZBTFNFKSArCiAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbj1Ib21lX1JhbmdlXzk1a2RlLXNlLCB5bWF4PUhvbWVfUmFuZ2VfOTVrZGUrc2UpLAogICAgICAgICAgICAgICAgd2lkdGg9LjEsIHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKCkpICsKICBnZW9tX2xpbmUocG9zaXRpb249cGRfUk0sYWVzKGxpbmV0eXBlPUVudmlyb25tZW50KSwgc2hvdy5sZWdlbmQ9RkFMU0UpICsKICAjIHNjYWxlX2xpbmV0eXBlX21hbnVhbCh2YWx1ZXM9YygiZG90ZGFzaCIsICJzb2xpZCIpKSsKICB0aGVtZV9idygpICsKICB4bGFiKCIiKSArCiAgeWxhYigiOTUlIEtERSBBcmVhIChoYSkiKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gYyguODcsLjg1KSwgbGVnZW5kLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoY29sb3VyID0gImJsYWNrIiksCiAgICAgICAgYXhpcy50ZXh0LnggID0gZWxlbWVudF90ZXh0KHZqdXN0PTAuNSwgc2l6ZT0xNiksCiAgICAgICAgYXhpcy50ZXh0LnkgID0gZWxlbWVudF90ZXh0KHZqdXN0PTAuNSwgc2l6ZT0xMiksCiAgICAgICAgYXhpcy50aXRsZS55ICA9IGVsZW1lbnRfdGV4dChzaXplPTE4KSwKICAgICAgICBheGlzLnRpdGxlLnggID0gZWxlbWVudF90ZXh0KHNpemU9MTgpLAogICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiwgZmFjZSA9ICJib2xkIiksCiAgICAgICAgc3RyaXAudGV4dCA9IGVsZW1lbnRfYmxhbmsoKSkgKwogIHNjYWxlX3hfZGlzY3JldGUobGFiZWxzPWMoIkZlbWFsZSIsICJNYWxlIikpIAoKUmF3LmtkZTwtUmF3LmtkZSArIHlsaW0oMCw5MCkKUmF3LmtkZQoKIyBSYXcua2RlPC1SYXcua2RlICsgdGhlbWUobGVnZW5kLnRpdGxlID0gZWxlbWVudF9ibGFuaygpLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQuanVzdGlmaWNhdGlvbj1jKDAsMSksCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC5wb3NpdGlvbj1jKDAuMDUsIDAuOTUpLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnZW5kLmtleSA9IGVsZW1lbnRfYmxhbmsoKSwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnZW5kLmJveC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGNvbG91ciA9ICJibGFjayIpKSArCiMgICBzY2FsZV9zaGFwZV9kaXNjcmV0ZShuYW1lICA9IiIsCiMgICAgICAgICAgICAgICAgICAgICAgICBicmVha3M9Yygibm9uc3Vic2lkaXplZCIsICJzdWJzaWRpemVkIiksCiMgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHM9YygiTm9uc3Vic2lkaXplZCIsICJTdWJzaWRpemVkIikpClJhdy5rZGU8LVJhdy5rZGUgKyB5bGltKDAsOTApClJhdy5rZGUKCmxpYnJhcnkoZ3JpZEV4dHJhKQpsaWJyYXJ5KGdyaWQpCgojIGdnYXJyYW5nZShSYXcua2RlLCBrZGUubWVhbi5hZGosIGxhYmVscyA9IGMoIkEiLCAiQiIpLAojICAgICAgICAgICBucm93ID0gMSkKCmBgYAoKCkNvbGxlY3RpdmUgZ3JpZCBvZiAxMDAlIE1DUCBhbmQgOTUlIEtERSBvZiBib3RoIHNpdGVzIGZyb20gYWJvdmUKYGBge3J9CmdnYXJyYW5nZShSYXcuWWVhckhSLCB5ci5tZWFuLmFkaiwgUmF3LmtkZSwga2RlLm1lYW4uYWRqLCBsYWJlbHMgPSBjKCJBIiwgIkIiLCAiQyIsIkQiKSwKICAgICAgICAgIG5jb2wgPSAyLCBucm93ID0gMikKYGBgCgoKCgo0My40IG1hbGUgNDIuOSBmZW1hbGUKWWVhcmx5IG92ZXJhbGwgbWVhbnMgb2YgOTUlIEtERXMgZ3JvdXBlZCBieSBzaXRlIGFuZCBzZXgKYGBge3J9CllSX01lYW5zLjk1S0RFYWxsIDwtIHN1bW1hcnlTRSh5ZWFyLCBtZWFzdXJldmFyPSJIb21lX1JhbmdlXzk1a2RlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwdmFycz1jKCJFbnZpcm9ubWVudCIsIlNleCIpLG5hLnJtID0gVFJVRSkKIAprYWJsZShZUl9NZWFucy45NUtERWFsbCwgZm9ybWF0ID0gInBhbmRvYyIsIGNhcHRpb24gPSAnVGFibGUgfCBSYXcgR3JvdXAgOTUlIEtERSBob21lIHJhbmdlIG1lYW5zIG1hbGUgYW5kIGZlbWFsZSBob21lIHJhbmdlcyBhdCBub24vc3Vic2lkaXplZC4nKQpgYGAKCgoKCgpQYWlyd2lzZSBDb21wYXJpc29ucywgYmV0d2VlbiBzZXhlcyBieSBlbnZpcm9ubWVudCwgYW5kIGJldHdlZW4gZW52aXJvbm1lbnRzIGF2ZXJhZ2VkIGFjcm9zcyBzZXgKYGBge3J9ClJNbW9kLnllYXIuRW08LWxtZXIoSG9tZV9SYW5nZV8xMDBtY3B+RW52aXJvbm1lbnQrWWVhcitTZXgrTjEwMCtFbnZpcm9ubWVudCpTZXgrCiAgICAgICAgICAgICAgICAgICAgICAoMXxHaWxhKSxkYXRhID0geWVhcikKClJNbW9kLnllYXIuRW05NTwtbG1lcihIb21lX1JhbmdlXzk1bWNwfkVudmlyb25tZW50K1llYXIrU2V4K045NStFbnZpcm9ubWVudCpTZXgrCiAgICAgICAgICAgICAgICAgICAgICAoMXxHaWxhKSxkYXRhID0geWVhcikKCiMgQ0FUQUdPUklaRSBMU00gR1JBUEggQlkgU0VYIEJFVFdFRU4gRU5WSVJPTk1FTlQ6CnJlZlJNX3NleCA8LSBsc21lYW5zKFJNbW9kLnllYXIuRW0sIHNwZWNzID0gYygiRW52aXJvbm1lbnQiLCJTZXgiKSkKCmVtbV9zLlRLIDwtIGVtbWVhbnMoUk1tb2QueWVhci5FbSwgcGFpcndpc2UgfiBFbnZpcm9ubWVudCB8IFNleCkKZW1tX3MuVEsKCmVtbV9zLnQyIDwtIGVtbWVhbnMoUk1tb2QueWVhci5FbSwgcGFpcndpc2UgfiBTZXggfCBFbnZpcm9ubWVudCkKZW1tX3MudDIKZW1tX3MuZTEgPC0gZW1tZWFucyhSTW1vZC55ZWFyLkVtOTUsIHBhaXJ3aXNlIH4gRW52aXJvbm1lbnQgfCBTZXgpCmVtbV9zLmUxCmBgYAoKCkdyYXBoaWNhbCBDb21wYXJpc29ucyBvZiBTZXggV2l0aGluIEVhY2ggRW52aXJvbm1lbnQ6CmBgYHtyfQpwbG90KGVtbV9zLnQyLCBjb21wYXJpc29ucyA9IFRSVUUsIHhsYWIgPSAiTGVhc3QgU3F1YXJlIE1lYW4gKGhhKSIsIHlsYWIgPSAiRW52aXJvbm1lbnQiKQpgYGAKCgoKClBhaXJ3aXNlIGJ5IHNleCBiZXR3ZWVuIGVudmlvcm5lbWVudHMgMTAwJSAgTUNQLCBhbmQgOTUlIEtERXMKYGBge3J9ClJNbW9kLjk1a2RlPC1sbWVyKEhvbWVfUmFuZ2VfOTVrZGV+RW52aXJvbm1lbnQrWWVhcitTZXgrTitFbnZpcm9ubWVudCpTZXgrKDF8R2lsYSksZGF0YSA9IHllYXIpCgojIyBDQVRBR09SSVpFIExTTSBHUkFQSCBCWSBTRVggQkVUV0VFTiBFTlZJUk9OTUVOVDoKcmVmUk1fa2RlIDwtIGxzbWVhbnMoUk1tb2QuOTVrZGUsIHNwZWNzID0gYygiRW52aXJvbm1lbnQiLCJTZXgiKSkKCmVtbV9zLnQzIDwtIGVtbWVhbnMoUk1tb2QueWVhci5FbSwgcGFpcndpc2UgfiBFbnZpcm9ubWVudCB8IFNleCkKZW1tX3MudDMKCmVtbV9zLnQ5NSA8LSBlbW1lYW5zKFJNbW9kLjk1a2RlLCBwYWlyd2lzZSB+IEVudmlyb25tZW50IHwgU2V4KQplbW1fcy50OTUKYGBgCgoKCkdyYXBoaWNhbCBDb21wYXJpc29ucyBvZiBTZXggYmV0d2VlbiB0aGUgdHdvIHBvcHVsYXRpb25zOgpgYGB7cn0KcGxvdChlbW1fcy50MywgY29tcGFyaXNvbnMgPSBUUlVFLCB4bGFiID0gIkxlYXN0IFNxdWFyZSBNZWFuIChoYSkiLCB5bGFiID0gIkVudmlyb25tZW50IikKYGBgCgoKCgoKSW5lcmFjdGl2ZSBtYXAgb2YgTUNQcyBhdCBTdG9uZSBDYW55b24KYGBge3J9Ck02N19NQ1A8LW1jcF9hbmFseXNpcy5QT0xZKCcuL002Ny9NNjcgLmNzdicsIHBlcmNlbnRhZ2U9IDEwMCkKTTY5X01DUDwtbWNwX2FuYWx5c2lzLlBPTFkoJy4vTTY5L002OSAuY3N2JywgcGVyY2VudGFnZT0gMTAwKQpNMjU1X01DUDwtbWNwX2FuYWx5c2lzLlBPTFkoJy4vTTI1NS9NMjU1IC5jc3YnLCBwZXJjZW50YWdlPSAxMDApCk0yMTVfTUNQPC1tY3BfYW5hbHlzaXMuUE9MWSgnLi9NMjE1L00yMTUgLmNzdicsIHBlcmNlbnRhZ2U9IDEwMCkKTTE0X01DUDwtbWNwX2FuYWx5c2lzLlBPTFkoJy4vTTE0L00xNCAuY3N2JywgcGVyY2VudGFnZT0gMTAwKQpNMTE5X01DUDwtbWNwX2FuYWx5c2lzLlBPTFkoJy4vTTExOS9NMTE5IC5jc3YnLCBwZXJjZW50YWdlPSAxMDApCk0xMTJfTUNQPC1tY3BfYW5hbHlzaXMuUE9MWSgnLi9NMTEyL00xMTIgLmNzdicsIHBlcmNlbnRhZ2U9IDEwMCkKCkY2Nl9NQ1A8LW1jcF9hbmFseXNpcy5QT0xZKCcuL0Y2Ni9GNjYgLmNzdicsIHBlcmNlbnRhZ2U9IDEwMCkKRjM2X01DUDwtbWNwX2FuYWx5c2lzLlBPTFkoJy4vRjM2L0YzNiAuY3N2JywgcGVyY2VudGFnZT0gMTAwKQpGMjUyX01DUDwtbWNwX2FuYWx5c2lzLlBPTFkoJy4vRjI1Mi9GMjUyIC5jc3YnLCBwZXJjZW50YWdlPSAxMDApCkYyMTRfTUNQPC1tY3BfYW5hbHlzaXMuUE9MWSgnLi9GMjE0L0YyMTQgLmNzdicsIHBlcmNlbnRhZ2U9IDEwMCkKRjIwMF9NQ1A8LW1jcF9hbmFseXNpcy5QT0xZKCcuL0YyMDAvRjIwMCAuY3N2JywgcGVyY2VudGFnZT0gMTAwKQpGMTQ3X01DUDwtbWNwX2FuYWx5c2lzLlBPTFkoJy4vRjE0Ny9GMTQ3IC5jc3YnLCBwZXJjZW50YWdlPSAxMDApCkYxNDZfTUNQPC1tY3BfYW5hbHlzaXMuUE9MWSgnLi9GMTQ2L0YxNDYgLmNzdicsIHBlcmNlbnRhZ2U9IDEwMCkKRjEzN19NQ1A8LW1jcF9hbmFseXNpcy5QT0xZKCcuL0YxMzcvRjEzNyAuY3N2JywgcGVyY2VudGFnZT0gMTAwKQpGMTM1X01DUDwtbWNwX2FuYWx5c2lzLlBPTFkoJy4vRjEzNS9GMTM1IC5jc3YnLCBwZXJjZW50YWdlPSAxMDApCkYxMTRfTUNQPC1tY3BfYW5hbHlzaXMuUE9MWSgnLi9GMTE0L0YxMTQgLmNzdicsIHBlcmNlbnRhZ2U9IDEwMCkKRjEwNF9NQ1A8LW1jcF9hbmFseXNpcy5QT0xZKCcuL0YxMDQvRjEwNCAuY3N2JywgcGVyY2VudGFnZT0gMTAwKQoKTWFsZS5NQ1AgPC0gcmJpbmQoTTY3X01DUCxNNjlfTUNQLE0yNTVfTUNQLE0yMTVfTUNQLE0xNF9NQ1AsTTExOV9NQ1AsTTExMl9NQ1ApCkZlbWFsZS5NQ1AgPC0gcmJpbmQoRjY2X01DUCxGMzZfTUNQLEYyNTJfTUNQLEYyMTRfTUNQLEYyMDBfTUNQLEYxNDdfTUNQLEYxNDZfTUNQLEYxMzdfTUNQLAogICAgICAgICAgICAgICAgICAgIEYxMzVfTUNQLEYxMTRfTUNQLEYxMDRfTUNQKQoKbWFwdmlld09wdGlvbnMoYmFzZW1hcHMgPSBjKCJPcGVuU3RyZWV0TWFwIiwiRXNyaS5Xb3JsZEltYWdlcnkiLCJPcGVuVG9wb01hcCIpLAogICAgICAgICAgICAgICBuYS5jb2xvciA9ICJtYWdlbnRhIiwKICAgICAgICAgICAgICAgbGF5ZXJzLmNvbnRyb2wucG9zID0gInRvcGxlZnQiKQoKbWFwdmlldyhNYWxlLk1DUCwgbGVnZW5kPUYsIHpjb2w9ImlkIiwgY29sLnJlZ2lvbnMgPSBjKCJibHVlIiksIGFscGhhLnJlZ2lvbnM9MC4zKSArIAogIG1hcHZpZXcoRmVtYWxlLk1DUCwgbGVnZW5kPUYsIHpjb2wgPSAiaWQiLCBjb2wucmVnaW9ucyA9IGMoInJlZCIpLCBhbHBoYS5yZWdpb25zPTAuMykKYGBgCgoKCgoKQ3JlYXRlIHN0YWduYW50IHN0YW1lbiBtYXAgb2YgTUNQcyBhdCBTdG9uZSBDYW55b24KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgcGFnZWQucHJpbnQ9RkFMU0V9CiMjIEdldC92aWV3IHRoZSBzdGFtZW4gbWFwIChiYm94IHNob3VsZCBiZSBhZGp1c3RlZCBhcHByb3ByaWF0ZWx5KToKbXlNYXAgPC0gZ2V0X3N0YW1lbm1hcChiYm94ID0gYyhsZWZ0ID0gLTExMS4wMDksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm90dG9tID0gMzIuNDU5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpZ2h0ID0gLTExMC45NjksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9wID0gMzIuNDc0KSwKICAgICAgICAgICAgICAgICAgICAgICBtYXB0eXBlID0gInRlcnJhaW4iLCAKICAgICAgICAgICAgICAgICAgICAgICBjcm9wID0gRkFMU0UsCiAgICAgICAgICAgICAgICAgICAgICAgem9vbSA9IDE1KQoKRjEwNF9sYXRsb24gPC0gc3BUcmFuc2Zvcm0oRjEwNF9NQ1AsIENSUygiK3Byb2o9bG9uZ2xhdCArZGF0dW09V0dTODQiKSkKRjExNF9sYXRsb24gPC0gc3BUcmFuc2Zvcm0oRjExNF9NQ1AsIENSUygiK3Byb2o9bG9uZ2xhdCArZGF0dW09V0dTODQiKSkKRjEzNV9sYXRsb24gPC0gc3BUcmFuc2Zvcm0oRjEzNV9NQ1AsIENSUygiK3Byb2o9bG9uZ2xhdCArZGF0dW09V0dTODQiKSkKRjEzN19sYXRsb24gPC0gc3BUcmFuc2Zvcm0oRjEzN19NQ1AsIENSUygiK3Byb2o9bG9uZ2xhdCArZGF0dW09V0dTODQiKSkKRjE0Nl9sYXRsb24gPC0gc3BUcmFuc2Zvcm0oRjE0Nl9NQ1AsIENSUygiK3Byb2o9bG9uZ2xhdCArZGF0dW09V0dTODQiKSkKRjE0N19sYXRsb24gPC0gc3BUcmFuc2Zvcm0oRjE0N19NQ1AsIENSUygiK3Byb2o9bG9uZ2xhdCArZGF0dW09V0dTODQiKSkKRjIwMF9sYXRsb24gPC0gc3BUcmFuc2Zvcm0oRjIwMF9NQ1AsIENSUygiK3Byb2o9bG9uZ2xhdCArZGF0dW09V0dTODQiKSkKRjIxNF9sYXRsb24gPC0gc3BUcmFuc2Zvcm0oRjIxNF9NQ1AsIENSUygiK3Byb2o9bG9uZ2xhdCArZGF0dW09V0dTODQiKSkKRjI1Ml9sYXRsb24gPC0gc3BUcmFuc2Zvcm0oRjI1Ml9NQ1AsIENSUygiK3Byb2o9bG9uZ2xhdCArZGF0dW09V0dTODQiKSkKRjM2X2xhdGxvbiA8LSBzcFRyYW5zZm9ybShGMzZfTUNQLCBDUlMoIitwcm9qPWxvbmdsYXQgK2RhdHVtPVdHUzg0IikpCkY2Nl9sYXRsb24gPC0gc3BUcmFuc2Zvcm0oRjY2X01DUCwgQ1JTKCIrcHJvaj1sb25nbGF0ICtkYXR1bT1XR1M4NCIpKQpNMTEyX2xhdGxvbiA8LSBzcFRyYW5zZm9ybShNMTEyX01DUCwgQ1JTKCIrcHJvaj1sb25nbGF0ICtkYXR1bT1XR1M4NCIpKQpNMTE5X2xhdGxvbiA8LSBzcFRyYW5zZm9ybShNMTE5X01DUCwgQ1JTKCIrcHJvaj1sb25nbGF0ICtkYXR1bT1XR1M4NCIpKQpNMTRfbGF0bG9uIDwtIHNwVHJhbnNmb3JtKE0xNF9NQ1AsIENSUygiK3Byb2o9bG9uZ2xhdCArZGF0dW09V0dTODQiKSkKTTIxNV9sYXRsb24gPC0gc3BUcmFuc2Zvcm0oTTIxNV9NQ1AsIENSUygiK3Byb2o9bG9uZ2xhdCArZGF0dW09V0dTODQiKSkKTTI1NV9sYXRsb24gPC0gc3BUcmFuc2Zvcm0oTTI1NV9NQ1AsIENSUygiK3Byb2o9bG9uZ2xhdCArZGF0dW09V0dTODQiKSkKTTY3X2xhdGxvbiA8LSBzcFRyYW5zZm9ybShNNjdfTUNQLCBDUlMoIitwcm9qPWxvbmdsYXQgK2RhdHVtPVdHUzg0IikpCk02OV9sYXRsb24gPC0gc3BUcmFuc2Zvcm0oTTY5X01DUCwgQ1JTKCIrcHJvaj1sb25nbGF0ICtkYXR1bT1XR1M4NCIpKQoKU0Nfc3RhbWVuX21hcCA8LSBnZ21hcChteU1hcCkgKwogICMgZ2VvbV9wb2ludChkYXRhID0gcHJval9sYXQubG9uLCBhZXMoeD14LCB5PXkpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuOCwgY29sb3IgPSAiYmxhY2siKSArCiAgZ2VvbV9wb2x5Z29uKGRhdGEgPSBmb3J0aWZ5KEYxMDRfbGF0bG9uKSwgYWVzKGxvbmcsIGxhdCwgZ3JvdXA9Z3JvdXApLCBjb2xvdXIgPSAicmVkIiwgCiAgICAgICAgICAgICBmaWxsID0gTkEpICsKICBnZW9tX3BvbHlnb24oZGF0YSA9IGZvcnRpZnkoRjExNF9sYXRsb24pLCBhZXMobG9uZywgbGF0LCBncm91cD1ncm91cCksIGNvbG91ciA9ICJyZWQiLCAKICAgICAgICAgICAgICAgZmlsbCA9IE5BKSArCiAgZ2VvbV9wb2x5Z29uKGRhdGEgPSBmb3J0aWZ5KEYxMzVfbGF0bG9uKSwgYWVzKGxvbmcsIGxhdCwgZ3JvdXA9Z3JvdXApLCBjb2xvdXIgPSAicmVkIiwgCiAgICAgICAgICAgICAgIGZpbGwgPSBOQSkgKwogIGdlb21fcG9seWdvbihkYXRhID0gZm9ydGlmeShGMTM3X2xhdGxvbiksIGFlcyhsb25nLCBsYXQsIGdyb3VwPWdyb3VwKSwgY29sb3VyID0gInJlZCIsIAogICAgICAgICAgICAgICBmaWxsID0gTkEpICsKICBnZW9tX3BvbHlnb24oZGF0YSA9IGZvcnRpZnkoRjE0Nl9sYXRsb24pLCBhZXMobG9uZywgbGF0LCBncm91cD1ncm91cCksIGNvbG91ciA9ICJyZWQiLCAKICAgICAgICAgICAgICAgZmlsbCA9IE5BKSArCiAgZ2VvbV9wb2x5Z29uKGRhdGEgPSBmb3J0aWZ5KEYxNDdfbGF0bG9uKSwgYWVzKGxvbmcsIGxhdCwgZ3JvdXA9Z3JvdXApLCBjb2xvdXIgPSAicmVkIiwgCiAgICAgICAgICAgICAgIGZpbGwgPSBOQSkgKwogIGdlb21fcG9seWdvbihkYXRhID0gZm9ydGlmeShGMjAwX2xhdGxvbiksIGFlcyhsb25nLCBsYXQsIGdyb3VwPWdyb3VwKSwgY29sb3VyID0gInJlZCIsIAogICAgICAgICAgICAgICBmaWxsID0gTkEpICsKICBnZW9tX3BvbHlnb24oZGF0YSA9IGZvcnRpZnkoRjIxNF9sYXRsb24pLCBhZXMobG9uZywgbGF0LCBncm91cD1ncm91cCksIGNvbG91ciA9ICJyZWQiLCAKICAgICAgICAgICAgICAgZmlsbCA9IE5BKSArCiAgZ2VvbV9wb2x5Z29uKGRhdGEgPSBmb3J0aWZ5KEYyNTJfbGF0bG9uKSwgYWVzKGxvbmcsIGxhdCwgZ3JvdXA9Z3JvdXApLCBjb2xvdXIgPSAicmVkIiwgCiAgICAgICAgICAgICAgIGZpbGwgPSBOQSkgKwogIGdlb21fcG9seWdvbihkYXRhID0gZm9ydGlmeShGMzZfbGF0bG9uKSwgYWVzKGxvbmcsIGxhdCwgZ3JvdXA9Z3JvdXApLCBjb2xvdXIgPSAicmVkIiwgCiAgICAgICAgICAgICAgIGZpbGwgPSBOQSkgKwogIGdlb21fcG9seWdvbihkYXRhID0gZm9ydGlmeShGNjZfbGF0bG9uKSwgYWVzKGxvbmcsIGxhdCwgZ3JvdXA9Z3JvdXApLCBjb2xvdXIgPSAicmVkIiwgCiAgICAgICAgICAgICAgIGZpbGwgPSBOQSkgKwogIGdlb21fcG9seWdvbihkYXRhID0gZm9ydGlmeShNMTEyX2xhdGxvbiksIGFlcyhsb25nLCBsYXQsIGdyb3VwPWdyb3VwKSwgY29sb3VyID0gImJsdWUiLAogICAgICAgICAgICAgICBmaWxsID0gTkEpICsKICBnZW9tX3BvbHlnb24oZGF0YSA9IGZvcnRpZnkoTTExOV9sYXRsb24pLCBhZXMobG9uZywgbGF0LCBncm91cD1ncm91cCksIGNvbG91ciA9ICJibHVlIiwKICAgICAgICAgICAgICAgZmlsbCA9IE5BKSArCiAgZ2VvbV9wb2x5Z29uKGRhdGEgPSBmb3J0aWZ5KE0xNF9sYXRsb24pLCBhZXMobG9uZywgbGF0LCBncm91cD1ncm91cCksIGNvbG91ciA9ICJibHVlIiwgCiAgICAgICAgICAgICAgIGZpbGwgPSBOQSkgKwogIGdlb21fcG9seWdvbihkYXRhID0gZm9ydGlmeShNMjE1X2xhdGxvbiksIGFlcyhsb25nLCBsYXQsIGdyb3VwPWdyb3VwKSwgY29sb3VyID0gImJsdWUiLAogICAgICAgICAgICAgICBmaWxsID0gTkEpICsKICBnZW9tX3BvbHlnb24oZGF0YSA9IGZvcnRpZnkoTTI1NV9sYXRsb24pLCBhZXMobG9uZywgbGF0LCBncm91cD1ncm91cCksIGNvbG91ciA9ICJibHVlIiwKICAgICAgICAgICAgICAgZmlsbCA9IE5BKSArCiAgZ2VvbV9wb2x5Z29uKGRhdGEgPSBmb3J0aWZ5KE02N19sYXRsb24pLCBhZXMobG9uZywgbGF0LCBncm91cD1ncm91cCksIGNvbG91ciA9ICJibHVlIiwgCiAgICAgICAgICAgICAgIGZpbGwgPSBOQSkgKwogIGdlb21fcG9seWdvbihkYXRhID0gZm9ydGlmeShNNjlfbGF0bG9uKSwgYWVzKGxvbmcsIGxhdCwgZ3JvdXA9Z3JvdXApLCBjb2xvdXIgPSAiYmx1ZSIsIAogICAgICAgICAgICAgICBmaWxsID0gTkEpICsKICB4bGFiKCJMb25naXR1ZGUiKSArCiAgeWxhYigiTGF0aXR1ZGUiKSArCiAgdGhlbWUoYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemU9MTUpLCAKICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZT0xNSkpCgojIFNDX3N0YW1lbl9tYXAKCmxpYnJhcnkoZ2dzbikKClNDX3N0YW1lbl9tYXA8LVNDX3N0YW1lbl9tYXAgKyBnZ3NuOjpzY2FsZWJhcih4Lm1pbiA9IC0xMTAuOTcyLCB4Lm1heCA9IC0xMTAuOTY2LAogICAgICAgICAgICAgICAgICAgICB5Lm1pbiA9IDMyLjQ3NCwgeS5tYXggPSAzMi40NzYsIAogICAgICAgICAgICAgICAgICAgICBkaXN0ID0gNTAwLCBkaXN0X3VuaXQ9Im0iLCAKICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0PTAuMTksCiAgICAgICAgICAgICAgICAgICAgIHN0LmJvdHRvbT1UUlVFLCAKICAgICAgICAgICAgICAgICAgICAgc3QuZGlzdD0wLjMsCiAgICAgICAgICAgICAgICAgICAgIHN0LnNpemU9My41LAogICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm0gPSBUUlVFLCAKICAgICAgICAgICAgICAgICAgICAgbW9kZWwgPSAnV0dTODQnKSAKIyBTQ19zdGFtZW5fbWFwClNDX3N0YW1lbl9tYXArbm9ydGgyKFNDX3N0YW1lbl9tYXAsIHggPSAwLjg5LCB5ID0gMC44NSwgc2NhbGUgPSAwLjEsIHN5bWJvbCA9IDE2KQpgYGAKCgoKYGBge3J9Cm15TWFwIDwtIGdldF9zdGFtZW5tYXAoYmJveCA9IGMobGVmdCA9IC0xMTEuMDA5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvdHRvbSA9IDMyLjQ1OSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByaWdodCA9IC0xMTAuOTY5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvcCA9IDMyLjQ3NCksCiAgICAgICAgICAgICAgICAgICAgICAgbWFwdHlwZSA9ICJ0ZXJyYWluIiwgCiAgICAgICAgICAgICAgICAgICAgICAgY3JvcCA9IEZBTFNFLAogICAgICAgICAgICAgICAgICAgICAgIHpvb20gPSAxNSkKCkYxMDRfbGF0bG9uSyA8LSBzcFRyYW5zZm9ybShGMTA0X0tERSwgQ1JTKCIrcHJvaj1sb25nbGF0ICtkYXR1bT1XR1M4NCIpKQpGMTE0X2xhdGxvbksgPC0gc3BUcmFuc2Zvcm0oRjExNF9LREUsIENSUygiK3Byb2o9bG9uZ2xhdCArZGF0dW09V0dTODQiKSkKRjEzNV9sYXRsb25LIDwtIHNwVHJhbnNmb3JtKEYxMzVfS0RFLCBDUlMoIitwcm9qPWxvbmdsYXQgK2RhdHVtPVdHUzg0IikpCkYxMzdfbGF0bG9uSyA8LSBzcFRyYW5zZm9ybShGMTM3X0tERSwgQ1JTKCIrcHJvaj1sb25nbGF0ICtkYXR1bT1XR1M4NCIpKQpGMTQ2X2xhdGxvbksgPC0gc3BUcmFuc2Zvcm0oRjE0Nl9LREUsIENSUygiK3Byb2o9bG9uZ2xhdCArZGF0dW09V0dTODQiKSkKRjE0N19sYXRsb25LIDwtIHNwVHJhbnNmb3JtKEYxNDdfS0RFLCBDUlMoIitwcm9qPWxvbmdsYXQgK2RhdHVtPVdHUzg0IikpCkYyMDBfbGF0bG9uSyA8LSBzcFRyYW5zZm9ybShGMjAwX0tERSwgQ1JTKCIrcHJvaj1sb25nbGF0ICtkYXR1bT1XR1M4NCIpKQpGMjE0X2xhdGxvbksgPC0gc3BUcmFuc2Zvcm0oRjIxNF9LREUsIENSUygiK3Byb2o9bG9uZ2xhdCArZGF0dW09V0dTODQiKSkKRjI1Ml9sYXRsb25LIDwtIHNwVHJhbnNmb3JtKEYyNTJfS0RFLCBDUlMoIitwcm9qPWxvbmdsYXQgK2RhdHVtPVdHUzg0IikpCkYzNl9sYXRsb25LIDwtIHNwVHJhbnNmb3JtKEYzNl9LREUsIENSUygiK3Byb2o9bG9uZ2xhdCArZGF0dW09V0dTODQiKSkKRjY2X2xhdGxvbksgPC0gc3BUcmFuc2Zvcm0oRjY2X0tERSwgQ1JTKCIrcHJvaj1sb25nbGF0ICtkYXR1bT1XR1M4NCIpKQpNMTEyX2xhdGxvbksgPC0gc3BUcmFuc2Zvcm0oTTExMl9LREUsIENSUygiK3Byb2o9bG9uZ2xhdCArZGF0dW09V0dTODQiKSkKTTExOV9sYXRsb25LIDwtIHNwVHJhbnNmb3JtKE0xMTlfS0RFLCBDUlMoIitwcm9qPWxvbmdsYXQgK2RhdHVtPVdHUzg0IikpCk0xNF9sYXRsb25LIDwtIHNwVHJhbnNmb3JtKE0xNF9LREUsIENSUygiK3Byb2o9bG9uZ2xhdCArZGF0dW09V0dTODQiKSkKTTIxNV9sYXRsb25LIDwtIHNwVHJhbnNmb3JtKE0yMTVfS0RFLCBDUlMoIitwcm9qPWxvbmdsYXQgK2RhdHVtPVdHUzg0IikpCk0yNTVfbGF0bG9uSyA8LSBzcFRyYW5zZm9ybShNMjU1X0tERSwgQ1JTKCIrcHJvaj1sb25nbGF0ICtkYXR1bT1XR1M4NCIpKQpNNjdfbGF0bG9uSyA8LSBzcFRyYW5zZm9ybShNNjdfS0RFLCBDUlMoIitwcm9qPWxvbmdsYXQgK2RhdHVtPVdHUzg0IikpCk02OV9sYXRsb25LIDwtIHNwVHJhbnNmb3JtKE02OV9LREUsIENSUygiK3Byb2o9bG9uZ2xhdCArZGF0dW09V0dTODQiKSkKClNDX3N0YW1lbl9tYXBLIDwtIGdnbWFwKG15TWFwKSArCiAgIyBnZW9tX3BvaW50KGRhdGEgPSBwcm9qX2xhdC5sb24sIGFlcyh4PXgsIHk9eSksIHNpemUgPSAwLjMsIGFscGhhID0gMC44LCBjb2xvciA9ICJibGFjayIpICsKICBnZW9tX3BvbHlnb24oZGF0YSA9IGZvcnRpZnkoRjEwNF9sYXRsb25LKSwgYWVzKGxvbmcsIGxhdCwgZ3JvdXA9Z3JvdXApLCBjb2xvdXIgPSAicmVkIiwKICAgICAgICAgICAgICAgZmlsbCA9IE5BKSArCiAgZ2VvbV9wb2x5Z29uKGRhdGEgPSBmb3J0aWZ5KEYxMTRfbGF0bG9uSyksIGFlcyhsb25nLCBsYXQsIGdyb3VwPWdyb3VwKSwgY29sb3VyID0gInJlZCIsCiAgICAgICAgICAgICAgIGZpbGwgPSBOQSkgKwogIGdlb21fcG9seWdvbihkYXRhID0gZm9ydGlmeShGMTM1X2xhdGxvbkspLCBhZXMobG9uZywgbGF0LCBncm91cD1ncm91cCksIGNvbG91ciA9ICJyZWQiLAogICAgICAgICAgICAgICBmaWxsID0gTkEpICsKICBnZW9tX3BvbHlnb24oZGF0YSA9IGZvcnRpZnkoRjEzN19sYXRsb25LKSwgYWVzKGxvbmcsIGxhdCwgZ3JvdXA9Z3JvdXApLCBjb2xvdXIgPSAicmVkIiwKICAgICAgICAgICAgICAgZmlsbCA9IE5BKSArCiAgZ2VvbV9wb2x5Z29uKGRhdGEgPSBmb3J0aWZ5KEYxNDZfbGF0bG9uSyksIGFlcyhsb25nLCBsYXQsIGdyb3VwPWdyb3VwKSwgY29sb3VyID0gInJlZCIsCiAgICAgICAgICAgICAgIGZpbGwgPSBOQSkgKwogIGdlb21fcG9seWdvbihkYXRhID0gZm9ydGlmeShGMTQ3X2xhdGxvbkspLCBhZXMobG9uZywgbGF0LCBncm91cD1ncm91cCksIGNvbG91ciA9ICJyZWQiLAogICAgICAgICAgICAgICBmaWxsID0gTkEpICsKICBnZW9tX3BvbHlnb24oZGF0YSA9IGZvcnRpZnkoRjIwMF9sYXRsb25LKSwgYWVzKGxvbmcsIGxhdCwgZ3JvdXA9Z3JvdXApLCBjb2xvdXIgPSAicmVkIiwKICAgICAgICAgICAgICAgZmlsbCA9IE5BKSArCiAgZ2VvbV9wb2x5Z29uKGRhdGEgPSBmb3J0aWZ5KEYyMTRfbGF0bG9uSyksIGFlcyhsb25nLCBsYXQsIGdyb3VwPWdyb3VwKSwgY29sb3VyID0gInJlZCIsCiAgICAgICAgICAgICAgIGZpbGwgPSBOQSkgKwogIGdlb21fcG9seWdvbihkYXRhID0gZm9ydGlmeShGMjUyX2xhdGxvbkspLCBhZXMobG9uZywgbGF0LCBncm91cD1ncm91cCksIGNvbG91ciA9ICJyZWQiLAogICAgICAgICAgICAgICBmaWxsID0gTkEpICsKICBnZW9tX3BvbHlnb24oZGF0YSA9IGZvcnRpZnkoRjM2X2xhdGxvbkspLCBhZXMobG9uZywgbGF0LCBncm91cD1ncm91cCksIGNvbG91ciA9ICJyZWQiLCAKICAgICAgICAgICAgICAgZmlsbCA9IE5BKSArCiAgZ2VvbV9wb2x5Z29uKGRhdGEgPSBmb3J0aWZ5KEY2Nl9sYXRsb25LKSwgYWVzKGxvbmcsIGxhdCwgZ3JvdXA9Z3JvdXApLCBjb2xvdXIgPSAicmVkIiwgCiAgICAgICAgICAgICAgIGZpbGwgPSBOQSkgKwogIGdlb21fcG9seWdvbihkYXRhID0gZm9ydGlmeShNMTEyX2xhdGxvbkspLCBhZXMobG9uZywgbGF0LCBncm91cD1ncm91cCksIGNvbG91ciA9ICJibHVlIiwgCiAgICAgICAgICAgICAgIGZpbGwgPSBOQSkgKwogIGdlb21fcG9seWdvbihkYXRhID0gZm9ydGlmeShNMTE5X2xhdGxvbkspLCBhZXMobG9uZywgbGF0LCBncm91cD1ncm91cCksIGNvbG91ciA9ICJibHVlIiwgCiAgICAgICAgICAgICAgIGZpbGwgPSBOQSkgKwogIGdlb21fcG9seWdvbihkYXRhID0gZm9ydGlmeShNMTRfbGF0bG9uSyksIGFlcyhsb25nLCBsYXQsIGdyb3VwPWdyb3VwKSwgY29sb3VyID0gImJsdWUiLAogICAgICAgICAgICAgICBmaWxsID0gTkEpICsKICBnZW9tX3BvbHlnb24oZGF0YSA9IGZvcnRpZnkoTTIxNV9sYXRsb25LKSwgYWVzKGxvbmcsIGxhdCwgZ3JvdXA9Z3JvdXApLCBjb2xvdXIgPSAiYmx1ZSIsIAogICAgICAgICAgICAgICBmaWxsID0gTkEpICsKICBnZW9tX3BvbHlnb24oZGF0YSA9IGZvcnRpZnkoTTI1NV9sYXRsb25LKSwgYWVzKGxvbmcsIGxhdCwgZ3JvdXA9Z3JvdXApLCBjb2xvdXIgPSAiYmx1ZSIsIAogICAgICAgICAgICAgICBmaWxsID0gTkEpICsKICBnZW9tX3BvbHlnb24oZGF0YSA9IGZvcnRpZnkoTTY3X2xhdGxvbkspLCBhZXMobG9uZywgbGF0LCBncm91cD1ncm91cCksIGNvbG91ciA9ICJibHVlIiwKICAgICAgICAgICAgICAgZmlsbCA9IE5BKSArCiAgZ2VvbV9wb2x5Z29uKGRhdGEgPSBmb3J0aWZ5KE02OV9sYXRsb25LKSwgYWVzKGxvbmcsIGxhdCwgZ3JvdXA9Z3JvdXApLCBjb2xvdXIgPSAiYmx1ZSIsCiAgICAgICAgICAgICAgIGZpbGwgPSBOQSkgKwogIHhsYWIoIkxvbmdpdHVkZSIpICsKICB5bGFiKCJMYXRpdHVkZSIpICsKICB0aGVtZShheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZT0xNSksIAogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplPTE1KSkKCiMgU0Nfc3RhbWVuX21hcEsKClNDX3N0YW1lbl9tYXBLIDwtIFNDX3N0YW1lbl9tYXBLICsgZ2dzbjo6c2NhbGViYXIoeC5taW4gPSAtMTEwLjk3MiwgeC5tYXggPSAtMTEwLjk2NiwKICAgICAgICAgICAgICAgICAgICAgeS5taW4gPSAzMi40NzYsIHkubWF4ID0gMzIuNDc4LCAKICAgICAgICAgICAgICAgICAgICAgZGlzdCA9IDUwMCwgZGlzdF91bml0PSJtIiwgCiAgICAgICAgICAgICAgICAgICAgIGhlaWdodD0wLjE5LAogICAgICAgICAgICAgICAgICAgICBzdC5ib3R0b209VFJVRSwgCiAgICAgICAgICAgICAgICAgICAgIHN0LmRpc3Q9MC4zLAogICAgICAgICAgICAgICAgICAgICBzdC5zaXplPTMuNSwKICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtID0gVFJVRSwgCiAgICAgICAgICAgICAgICAgICAgIG1vZGVsID0gJ1dHUzg0JykgCiMgU0Nfc3RhbWVuX21hcEsKClNDX3N0YW1lbl9tYXBLICsgbm9ydGgyKFNDX3N0YW1lbl9tYXBLLCB4ID0gMC44OSwgeSA9IDAuODQsIHNjYWxlID0gMC4xLCBzeW1ib2wgPSAxNikKYGBgCgoKCmBgYHtyfQpTZWFzb24uTWFwIDwtIGdldF9zdGFtZW5tYXAoYmJveCA9IGMobGVmdCA9IC0xMTEuMDA1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvdHRvbSA9IDMyLjQ2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpZ2h0ID0gLTExMC45OCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3AgPSAzMi40NzUpLAogICAgICAgICAgICAgICAgICAgICAgIG1hcHR5cGUgPSAidG9uZXItYmFja2dyb3VuZCIsIAogICAgICAgICAgICAgICAgICAgICAgIGNyb3AgPSBGQUxTRSwKICAgICAgICAgICAgICAgICAgICAgICB6b29tID0gMTYpCgpTQ19zdGFtZW5fbWFwUyA8LSBnZ21hcChTZWFzb24uTWFwKSArCiAgIyBnZW9tX3BvaW50KGRhdGEgPSBwcm9qX2xhdC5sb24sIGFlcyh4PXgsIHk9eSksIHNpemUgPSAwLjMsIGFscGhhID0gMC44LCBjb2xvciA9ICJibGFjayIpICsKICBnZW9tX3BvbHlnb24oZGF0YSA9IGZvcnRpZnkoRjExNF9sYXRsb25FKSwgYWVzKGxvbmcsIGxhdCwgZ3JvdXA9Z3JvdXApLCBjb2xvdXIgPSAiYmxhY2siLCAKICAgICAgICAgICAgICAgbGluZXR5cGU9MiwgZmlsbCA9IE5BKSArCiAgZ2VvbV9wb2x5Z29uKGRhdGEgPSBmb3J0aWZ5KEYxMTRfbGF0bG9uRCksIGFlcyhsb25nLCBsYXQsIGdyb3VwPWdyb3VwKSwgY29sb3VyID0gInJlZCIsIAogICAgICAgICAgICAgICBsaW5ldHlwZT0yLCBmaWxsID0gTkEpICsKICBnZW9tX3BvbHlnb24oZGF0YSA9IGZvcnRpZnkoRjExNF9sYXRsb25NKSwgYWVzKGxvbmcsIGxhdCwgZ3JvdXA9Z3JvdXApLCBjb2xvdXIgPSAiYmx1ZSIsIAogICAgICAgICAgICAgICBsaW5ldHlwZT0yLCBmaWxsID0gTkEpICsKICBnZW9tX3BvbHlnb24oZGF0YSA9IGZvcnRpZnkoRjExNF9sYXRsb25QKSwgYWVzKGxvbmcsIGxhdCwgZ3JvdXA9Z3JvdXApLCBjb2xvdXIgPSAiZ3JlZW4iLCAKICAgICAgICAgICAgICAgbGluZXR5cGU9MiwgZmlsbCA9IE5BKSArCiAgZ2VvbV9wb2x5Z29uKGRhdGEgPSBmb3J0aWZ5KEYxMzdfbGF0bG9uRSksIGFlcyhsb25nLCBsYXQsIGdyb3VwPWdyb3VwKSwgY29sb3VyID0gImJsYWNrIiwgCiAgICAgICAgICAgICAgIGxpbmV0eXBlPTEsIGZpbGwgPSBOQSkgKwogIGdlb21fcG9seWdvbihkYXRhID0gZm9ydGlmeShGMTM3X2xhdGxvbkQpLCBhZXMobG9uZywgbGF0LCBncm91cD1ncm91cCksIGNvbG91ciA9ICJyZWQiLCAKICAgICAgICAgICAgICAgbGluZXR5cGU9MSwgZmlsbCA9IE5BKSArCiAgZ2VvbV9wb2x5Z29uKGRhdGEgPSBmb3J0aWZ5KEYxMzdfbGF0bG9uTSksIGFlcyhsb25nLCBsYXQsIGdyb3VwPWdyb3VwKSwgY29sb3VyID0gImJsdWUiLCAKICAgICAgICAgICAgICAgbGluZXR5cGU9MSwgZmlsbCA9IE5BKSArCiAgZ2VvbV9wb2x5Z29uKGRhdGEgPSBmb3J0aWZ5KEYxMzdfbGF0bG9uUCksIGFlcyhsb25nLCBsYXQsIGdyb3VwPWdyb3VwKSwgY29sb3VyID0gImdyZWVuIiwgCiAgICAgICAgICAgICAgIGxpbmV0eXBlPTEsIGZpbGwgPSBOQSkgKwogIGdlb21fcG9seWdvbihkYXRhID0gZm9ydGlmeShGMTQ3X2xhdGxvbkUpLCBhZXMobG9uZywgbGF0LCBncm91cD1ncm91cCksIGNvbG91ciA9ICJibGFjayIsIAogICAgICAgICAgICAgICBsaW5ldHlwZT0zLCBmaWxsID0gTkEpICsKICBnZW9tX3BvbHlnb24oZGF0YSA9IGZvcnRpZnkoRjE0N19sYXRsb25EKSwgYWVzKGxvbmcsIGxhdCwgZ3JvdXA9Z3JvdXApLCBjb2xvdXIgPSAicmVkIiwgCiAgICAgICAgICAgICAgIGxpbmV0eXBlPTMsIGZpbGwgPSBOQSkgKwogIGdlb21fcG9seWdvbihkYXRhID0gZm9ydGlmeShGMTQ3X2xhdGxvbk0pLCBhZXMobG9uZywgbGF0LCBncm91cD1ncm91cCksIGNvbG91ciA9ICJibHVlIiwgCiAgICAgICAgICAgICAgIGxpbmV0eXBlPTMsIGZpbGwgPSBOQSkgKwogIGdlb21fcG9seWdvbihkYXRhID0gZm9ydGlmeShGMTQ3X2xhdGxvblApLCBhZXMobG9uZywgbGF0LCBncm91cD1ncm91cCksIGNvbG91ciA9ICJncmVlbiIsIAogICAgICAgICAgICAgICBsaW5ldHlwZT0zLCBmaWxsID0gTkEpICsKICBnZW9tX3BvbHlnb24oZGF0YSA9IGZvcnRpZnkoRjM2X2xhdGxvbkUpLCBhZXMobG9uZywgbGF0LCBncm91cD1ncm91cCksIGNvbG91ciA9ICJibGFjayIsIAogICAgICAgICAgICAgICBsaW5ldHlwZT00LCBmaWxsID0gTkEpICsKICBnZW9tX3BvbHlnb24oZGF0YSA9IGZvcnRpZnkoRjM2X2xhdGxvbkQpLCBhZXMobG9uZywgbGF0LCBncm91cD1ncm91cCksIGNvbG91ciA9ICJyZWQiLCAKICAgICAgICAgICAgICAgbGluZXR5cGU9NCwgZmlsbCA9IE5BKSArCiAgZ2VvbV9wb2x5Z29uKGRhdGEgPSBmb3J0aWZ5KEYzNl9sYXRsb25NKSwgYWVzKGxvbmcsIGxhdCwgZ3JvdXA9Z3JvdXApLCBjb2xvdXIgPSAiYmx1ZSIsCiAgICAgICAgICAgICAgIGxpbmV0eXBlPTQsIGZpbGwgPSBOQSkgKwogIGdlb21fcG9seWdvbihkYXRhID0gZm9ydGlmeShGMzZfbGF0bG9uUCksIGFlcyhsb25nLCBsYXQsIGdyb3VwPWdyb3VwKSwgY29sb3VyID0gImdyZWVuIiwgCiAgICAgICAgICAgICAgIGxpbmV0eXBlPTQsIGZpbGwgPSBOQSkgKwogIGdlb21fcG9seWdvbihkYXRhID0gZm9ydGlmeShGNjZfbGF0bG9uRSksIGFlcyhsb25nLCBsYXQsIGdyb3VwPWdyb3VwKSwgY29sb3VyID0gImJsYWNrIiwgCiAgICAgICAgICAgICAgIGxpbmV0eXBlPTUsIGZpbGwgPSBOQSkgKwogIGdlb21fcG9seWdvbihkYXRhID0gZm9ydGlmeShGNjZfbGF0bG9uRCksIGFlcyhsb25nLCBsYXQsIGdyb3VwPWdyb3VwKSwgY29sb3VyID0gInJlZCIsIAogICAgICAgICAgICAgICBsaW5ldHlwZT01LCBmaWxsID0gTkEpICsKICBnZW9tX3BvbHlnb24oZGF0YSA9IGZvcnRpZnkoRjY2X2xhdGxvbk0pLCBhZXMobG9uZywgbGF0LCBncm91cD1ncm91cCksIGNvbG91ciA9ICJibHVlIiwKICAgICAgICAgICAgICAgbGluZXR5cGU9NSwgZmlsbCA9IE5BKSArCiAgZ2VvbV9wb2x5Z29uKGRhdGEgPSBmb3J0aWZ5KEY2Nl9sYXRsb25QKSwgYWVzKGxvbmcsIGxhdCwgZ3JvdXA9Z3JvdXApLCBjb2xvdXIgPSAiZ3JlZW4iLAogICAgICAgICAgICAgICBsaW5ldHlwZT01LCBmaWxsID0gTkEpICsKICB4bGFiKCJMb25naXR1ZGUiKSArCiAgeWxhYigiTGF0aXR1ZGUiKSArCiAgdGhlbWUoYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemU9MTUpLCAKICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZT0xNSkpCgpTQ19zdGFtZW5fbWFwUyA8LSBTQ19zdGFtZW5fbWFwUyArIGdnc246OnNjYWxlYmFyKHgubWluID0gLTExMS4wMDUsIHgubWF4ID0gLTExMC45OTgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeS5taW4gPSAzMi40NjEsIHkubWF4ID0gMzIuNDYzLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXN0ID0gMjUwLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXN0X3VuaXQ9Im0iLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ9MC4xOSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdC5ib3R0b209RkFMU0UsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0LmRpc3Q9MC4zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0LnNpemU9MywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm0gPSBUUlVFLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbCA9ICdXR1M4NCcpIAojIFNDX3N0YW1lbl9tYXBTCgpTQ19zdGFtZW5fbWFwUyArIG5vcnRoMihTQ19zdGFtZW5fbWFwUywgeCA9IDAuMzYsIHkgPSAwLjMwLCBzY2FsZSA9IDAuMSwgc3ltYm9sID0gMTYpCmBgYAoKCgpgYGB7cn0KTUNQLlNoaWZ0LlllYXJseSA8LSBnZ21hcChTZWFzb24uTWFwKSArCiAgIyBnZW9tX3BvaW50KGRhdGEgPSBwcm9qX2xhdC5sb24sIGFlcyh4PXgsIHk9eSksIHNpemUgPSAwLjMsIGFscGhhID0gMC44LCBjb2xvciA9ICJibGFjayIpICsKICBnZW9tX3BvbHlnb24oZGF0YSA9IGZvcnRpZnkoRjExNF9sYXRsb24uMDgpLCBhZXMobG9uZywgbGF0LCBncm91cD1ncm91cCksIGNvbG91ciA9ICJyZWQiLCAKICAgICAgICAgICAgICAgbGluZXR5cGU9MSwgZmlsbCA9IE5BKSArCiAgZ2VvbV9wb2x5Z29uKGRhdGEgPSBmb3J0aWZ5KEYxMTRfbGF0bG9uLjA5KSwgYWVzKGxvbmcsIGxhdCwgZ3JvdXA9Z3JvdXApLCBjb2xvdXIgPSAicmVkIiwgCiAgICAgICAgICAgICAgIGxpbmV0eXBlPTEsIGZpbGwgPSBOQSkgKwogIGdlb21fcG9seWdvbihkYXRhID0gZm9ydGlmeShGMTE0X2xhdGxvbi4xMCksIGFlcyhsb25nLCBsYXQsIGdyb3VwPWdyb3VwKSwgY29sb3VyID0gInJlZCIsIAogICAgICAgICAgICAgICBsaW5ldHlwZT0xLCBmaWxsID0gTkEpICsKICBnZW9tX3BvbHlnb24oZGF0YSA9IGZvcnRpZnkoRjExNF9sYXRsb24uMTEpLCBhZXMobG9uZywgbGF0LCBncm91cD1ncm91cCksIGNvbG91ciA9ICJyZWQiLCAKICAgICAgICAgICAgICAgbGluZXR5cGU9MSwgZmlsbCA9IE5BKSArCiAgZ2VvbV9wb2x5Z29uKGRhdGEgPSBmb3J0aWZ5KEYxMTRfbGF0bG9uLjEyKSwgYWVzKGxvbmcsIGxhdCwgZ3JvdXA9Z3JvdXApLCBjb2xvdXIgPSAicmVkIiwgCiAgICAgICAgICAgICAgIGxpbmV0eXBlPTEsIGZpbGwgPSBOQSkgKwogICMgZ2VvbV9wb2x5Z29uKGRhdGEgPSBmb3J0aWZ5KEYxMzdfbGF0bG9uLjA5KSwgYWVzKGxvbmcsIGxhdCwgZ3JvdXA9Z3JvdXApLCBjb2xvdXIgPSAicmVkIiwgCiAgIyAgICAgICAgICAgICAgbGluZXR5cGU9MSwgZmlsbCA9IE5BKSArCiAgIyBnZW9tX3BvbHlnb24oZGF0YSA9IGZvcnRpZnkoRjEzN19sYXRsb24uMTApLCBhZXMobG9uZywgbGF0LCBncm91cD1ncm91cCksIGNvbG91ciA9ICJyZWQiLCAKICAjICAgICAgICAgICAgICBsaW5ldHlwZT0xLCBmaWxsID0gTkEpICsKICAjIGdlb21fcG9seWdvbihkYXRhID0gZm9ydGlmeShGMTM3X2xhdGxvbi4xMSksIGFlcyhsb25nLCBsYXQsIGdyb3VwPWdyb3VwKSwgY29sb3VyID0gInJlZCIsIAogICMgICAgICAgICAgICAgIGxpbmV0eXBlPTEsIGZpbGwgPSBOQSkgKwogIGdlb21fcG9seWdvbihkYXRhID0gZm9ydGlmeShGMTQ3X2xhdGxvbi4wOSksIGFlcyhsb25nLCBsYXQsIGdyb3VwPWdyb3VwKSwgY29sb3VyID0gInJlZCIsIAogICAgICAgICAgICAgICBsaW5ldHlwZT0xLCBmaWxsID0gTkEpICsKICBnZW9tX3BvbHlnb24oZGF0YSA9IGZvcnRpZnkoRjE0N19sYXRsb24uMTApLCBhZXMobG9uZywgbGF0LCBncm91cD1ncm91cCksIGNvbG91ciA9ICJyZWQiLCAKICAgICAgICAgICAgICAgbGluZXR5cGU9MSwgZmlsbCA9IE5BKSArCiAgZ2VvbV9wb2x5Z29uKGRhdGEgPSBmb3J0aWZ5KEYxNDdfbGF0bG9uLjExKSwgYWVzKGxvbmcsIGxhdCwgZ3JvdXA9Z3JvdXApLCBjb2xvdXIgPSAicmVkIiwgCiAgICAgICAgICAgICAgIGxpbmV0eXBlPTEsIGZpbGwgPSBOQSkgKwogIGdlb21fcG9seWdvbihkYXRhID0gZm9ydGlmeShGMTQ3X2xhdGxvbi4xMiksIGFlcyhsb25nLCBsYXQsIGdyb3VwPWdyb3VwKSwgY29sb3VyID0gInJlZCIsIAogICAgICAgICAgICAgICBsaW5ldHlwZT0xLCBmaWxsID0gTkEpICsKICBnZW9tX3BvbHlnb24oZGF0YSA9IGZvcnRpZnkoRjY2X2xhdGxvbi4wOCksIGFlcyhsb25nLCBsYXQsIGdyb3VwPWdyb3VwKSwgY29sb3VyID0gInJlZCIsIAogICAgICAgICAgICAgICBsaW5ldHlwZT0xLCBmaWxsID0gTkEpICsKICBnZW9tX3BvbHlnb24oZGF0YSA9IGZvcnRpZnkoRjY2X2xhdGxvbi4wOSksIGFlcyhsb25nLCBsYXQsIGdyb3VwPWdyb3VwKSwgY29sb3VyID0gInJlZCIsIAogICAgICAgICAgICAgICBsaW5ldHlwZT0xLCBmaWxsID0gTkEpICsKICBnZW9tX3BvbHlnb24oZGF0YSA9IGZvcnRpZnkoRjY2X2xhdGxvbi4xMCksIGFlcyhsb25nLCBsYXQsIGdyb3VwPWdyb3VwKSwgY29sb3VyID0gInJlZCIsIAogICAgICAgICAgICAgICBsaW5ldHlwZT0xLCBmaWxsID0gTkEpICsKICBnZW9tX3BvbHlnb24oZGF0YSA9IGZvcnRpZnkoTTExOV9sYXRsb24uMDgpLCBhZXMobG9uZywgbGF0LCBncm91cD1ncm91cCksIGNvbG91ciA9ICJyZWQiLCAKICAgICAgICAgICAgICAgbGluZXR5cGU9MSwgZmlsbCA9IE5BKSArCiAgZ2VvbV9wb2x5Z29uKGRhdGEgPSBmb3J0aWZ5KE0xMTlfbGF0bG9uLjA5KSwgYWVzKGxvbmcsIGxhdCwgZ3JvdXA9Z3JvdXApLCBjb2xvdXIgPSAicmVkIiwgCiAgICAgICAgICAgICAgIGxpbmV0eXBlPTEsIGZpbGwgPSBOQSkgKwogIGdlb21fcG9seWdvbihkYXRhID0gZm9ydGlmeShNMTE5X2xhdGxvbi4xMCksIGFlcyhsb25nLCBsYXQsIGdyb3VwPWdyb3VwKSwgY29sb3VyID0gInJlZCIsIAogICAgICAgICAgICAgICBsaW5ldHlwZT0xLCBmaWxsID0gTkEpICsKICAjIGdlb21fcG9seWdvbihkYXRhID0gZm9ydGlmeShNMTEyX2xhdGxvbi4wNyksIGFlcyhsb25nLCBsYXQsIGdyb3VwPWdyb3VwKSwgY29sb3VyID0gInJlZCIsIAogICMgICAgICAgICAgICAgIGxpbmV0eXBlPTYsIGZpbGwgPSBOQSkgKwogICMgZ2VvbV9wb2x5Z29uKGRhdGEgPSBmb3J0aWZ5KE0xMTJfbGF0bG9uLjA5KSwgYWVzKGxvbmcsIGxhdCwgZ3JvdXA9Z3JvdXApLCBjb2xvdXIgPSAicmVkIiwKICAjICAgICAgICAgICAgICBsaW5ldHlwZT02LCBmaWxsID0gTkEpICsKICAjIGdlb21fcG9seWdvbihkYXRhID0gZm9ydGlmeShNMTEyX2xhdGxvbi4xMCksIGFlcyhsb25nLCBsYXQsIGdyb3VwPWdyb3VwKSwgY29sb3VyID0gInJlZCIsCiAgIyAgICAgICAgICAgICAgbGluZXR5cGU9NiwgZmlsbCA9IE5BKSArCiAgeGxhYigiTG9uZ2l0dWRlIikgKwogIHlsYWIoIkxhdGl0dWRlIikgKwogIHRoZW1lKGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplPTE1KSwgCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemU9MTUpKQoKTUNQLlNoaWZ0LlllYXJseSA8LSBNQ1AuU2hpZnQuWWVhcmx5ICsgZ2dzbjo6c2NhbGViYXIoeC5taW4gPSAtMTExLjAwNSwgeC5tYXggPSAtMTEwLjk5OCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5Lm1pbiA9IDMyLjQ2MSwgeS5tYXggPSAzMi40NjMsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3QgPSAyNTAsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3RfdW5pdD0ibSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodD0wLjE5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0LmJvdHRvbT1GQUxTRSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3QuZGlzdD0wLjMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Quc2l6ZT0zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybSA9IFRSVUUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsID0gJ1dHUzg0JykgCiMgTUNQLlNoaWZ0LlllYXJseQoKTUNQLlNoaWZ0LlllYXJseSArIG5vcnRoMihNQ1AuU2hpZnQuWWVhcmx5LCB4ID0gMC4zNiwgeSA9IDAuMzAsIHNjYWxlID0gMC4xLCBzeW1ib2wgPSAxNikKYGBgCgoKCkludGVyYWN0aXZlIG1hcCBvZiBLREVzIGF0IFN0b25lIENhbnlvbgpgYGB7cn0KTTY3X0tERTwta2RlX2FuYWx5c2lzLmhyZWYucG9seWdvbignLi9NNjcvTTY3IC5jc3YnLCBwZXJjZW50YWdlPSA5NSkKTTY5X0tERTwta2RlX2FuYWx5c2lzLmhyZWYucG9seWdvbignLi9NNjkvTTY5IC5jc3YnLCBwZXJjZW50YWdlPSA5NSkKTTI1NV9LREU8LWtkZV9hbmFseXNpcy5ocmVmLnBvbHlnb24oJy4vTTI1NS9NMjU1IC5jc3YnLCBwZXJjZW50YWdlPSA5NSkKTTIxNV9LREU8LWtkZV9hbmFseXNpcy5ocmVmLnBvbHlnb24oJy4vTTIxNS9NMjE1IC5jc3YnLCBwZXJjZW50YWdlPSA5NSkKTTE0X0tERTwta2RlX2FuYWx5c2lzLmhyZWYucG9seWdvbignLi9NMTQvTTE0IC5jc3YnLCBwZXJjZW50YWdlPSA5NSkKTTExOV9LREU8LWtkZV9hbmFseXNpcy5ocmVmLnBvbHlnb24oJy4vTTExOS9NMTE5IC5jc3YnLCBwZXJjZW50YWdlPSA5NSkKTTExMl9LREU8LWtkZV9hbmFseXNpcy5ocmVmLnBvbHlnb24oJy4vTTExMi9NMTEyIC5jc3YnLCBwZXJjZW50YWdlPSA5NSkKCkY2Nl9LREU8LWtkZV9hbmFseXNpcy5ocmVmLnBvbHlnb24oJy4vRjY2L0Y2NiAuY3N2JywgcGVyY2VudGFnZT0gOTUpCkYzNl9LREU8LWtkZV9hbmFseXNpcy5ocmVmLnBvbHlnb24oJy4vRjM2L0YzNiAuY3N2JywgcGVyY2VudGFnZT0gOTUpCkYyNTJfS0RFPC1rZGVfYW5hbHlzaXMuaHJlZi5wb2x5Z29uKCcuL0YyNTIvRjI1MiAuY3N2JywgcGVyY2VudGFnZT0gOTUpCkYyMTRfS0RFPC1rZGVfYW5hbHlzaXMuaHJlZi5wb2x5Z29uKCcuL0YyMTQvRjIxNCAuY3N2JywgcGVyY2VudGFnZT0gOTUpCkYyMDBfS0RFPC1rZGVfYW5hbHlzaXMuaHJlZi5wb2x5Z29uKCcuL0YyMDAvRjIwMCAuY3N2JywgcGVyY2VudGFnZT0gOTUpCkYxNDdfS0RFPC1rZGVfYW5hbHlzaXMuaHJlZi5wb2x5Z29uKCcuL0YxNDcvRjE0NyAuY3N2JywgcGVyY2VudGFnZT0gOTUpCkYxNDZfS0RFPC1rZGVfYW5hbHlzaXMuaHJlZi5wb2x5Z29uKCcuL0YxNDYvRjE0NiAuY3N2JywgcGVyY2VudGFnZT0gOTUpCkYxMzdfS0RFPC1rZGVfYW5hbHlzaXMuaHJlZi5wb2x5Z29uKCcuL0YxMzcvRjEzNyAuY3N2JywgcGVyY2VudGFnZT0gOTUpCkYxMzVfS0RFPC1rZGVfYW5hbHlzaXMuaHJlZi5wb2x5Z29uKCcuL0YxMzUvRjEzNSAuY3N2JywgcGVyY2VudGFnZT0gOTUpCkYxMTRfS0RFPC1rZGVfYW5hbHlzaXMuaHJlZi5wb2x5Z29uKCcuL0YxMTQvRjExNCAuY3N2JywgcGVyY2VudGFnZT0gOTUpCkYxMDRfS0RFPC1rZGVfYW5hbHlzaXMuaHJlZi5wb2x5Z29uKCcuL0YxMDQvRjEwNCAuY3N2JywgcGVyY2VudGFnZT0gOTUpCgpNYWxlLktERSA8LSByYmluZChNNjdfS0RFLE02OV9LREUsTTI1NV9LREUsTTIxNV9LREUsTTE0X0tERSxNMTE5X0tERSxNMTEyX0tERSkKRmVtYWxlLktERSA8LSByYmluZChGNjZfS0RFLEYzNl9LREUsRjI1Ml9LREUsRjIxNF9LREUsRjIwMF9LREUsRjE0N19LREUsRjE0Nl9LREUsRjEzN19LREUsCiAgICAgICAgICAgICAgICAgICAgRjEzNV9LREUsRjExNF9LREUsRjEwNF9LREUpCgptYXB2aWV3T3B0aW9ucyhiYXNlbWFwcyA9IGMoIk9wZW5TdHJlZXRNYXAiLCJFc3JpLldvcmxkSW1hZ2VyeSIsIk9wZW5Ub3BvTWFwIiksCiAgICAgICAgICAgICAgIG5hLmNvbG9yID0gIm1hZ2VudGEiLAogICAgICAgICAgICAgICBsYXllcnMuY29udHJvbC5wb3MgPSAidG9wbGVmdCIpCgptYXB2aWV3KE1hbGUuS0RFLCBsZWdlbmQ9RiwgemNvbD0iaWQiLCBjb2wucmVnaW9ucyA9IGMoImJsdWUiKSwgYWxwaGEucmVnaW9ucz0wLjMpICsgCiAgbWFwdmlldyhGZW1hbGUuS0RFLCBsZWdlbmQ9RiwgemNvbCA9ICJpZCIsIGNvbC5yZWdpb25zID0gYygicmVkIiksIGFscGhhLnJlZ2lvbnM9MC4zKQpgYGAKCgoKClRBQkxFIApgYGB7cn0Ka2FibGUocmVmX2RmUk1fa2RlLCBmb3JtYXQgPSAicGFuZG9jIiwgY2FwdGlvbiA9ICdUYWJsZSAgfCBTdWJzaWRpemVkIGFuZCBub24tc3Vic2lkaXplZCBkaXJlY3Rpb25hbCBtZWFucyBvZiBLREUgaG9tZSByYW5nZXMgYWZ0ZXIgYmVpbmcgYWRqdXN0ZWQgZm9yIHllYXIsIHNleCBhbmQgc2FtcGxlIHNpemUuJykKYGBgCgoKCgojIyMjIyMjIyMjIyMjIyMgU0VBU09OQUwgQU5BTFlTRVMgIyMjIyMjIyMjIyMjIyMjIyMjCgoKTWFwIG9mIHNlYXNvbmFsIGZsdWN0aW9ucyBvZiBob21lIHJhbmdlcwpgYGB7cn0KIyMgQ3JlYXRlIE1DUCBwb2x5Z29ucyBieSBTRUFTT046Ck0yMTVfbWNwLkVNPC1tY3BfYW5hbHlzaXMuUE9MWSgiLi9NMjE1L0VtZXJnZW5jZSAuY3N2IiwgcGVyY2VudGFnZT0gMTAwKQpNMjE1X21jcC5EUlk8LW1jcF9hbmFseXNpcy5QT0xZKCIuL00yMTUvRHJ5IC5jc3YiLCBwZXJjZW50YWdlPSAxMDApCk0yMTVfbWNwLk1PTjwtbWNwX2FuYWx5c2lzLlBPTFkoIi4vTTIxNS9Nb25zb29uIC5jc3YiLCBwZXJjZW50YWdlPSAxMDApCgpNMTEyX21jcC5EUlk8LW1jcF9hbmFseXNpcy5QT0xZKCIuL00xMTIvRHJ5IC5jc3YiLCBwZXJjZW50YWdlPSAxMDApCk0xMTJfbWNwLk1PTjwtbWNwX2FuYWx5c2lzLlBPTFkoIi4vTTExMi9Nb25zb29uIC5jc3YiLCBwZXJjZW50YWdlPSAxMDApCk0xMTJfbWNwLlBNPC1tY3BfYW5hbHlzaXMuUE9MWSgiLi9NMTEyL1Bvc3RfTW9uc29vbiAuY3N2IiwgcGVyY2VudGFnZT0gMTAwKQoKTTExOV9tY3AuRFJZPC1tY3BfYW5hbHlzaXMuUE9MWSgiLi9NMTE5L0RyeSAuY3N2IiwgcGVyY2VudGFnZT0gMTAwKQpNMTE5X21jcC5NT048LW1jcF9hbmFseXNpcy5QT0xZKCIuL00xMTkvTW9uc29vbiAuY3N2IiwgcGVyY2VudGFnZT0gMTAwKQpNMTE5X21jcC5QTTwtbWNwX2FuYWx5c2lzLlBPTFkoIi4vTTExOS9Qb3N0X01vbnNvb24gLmNzdiIsIHBlcmNlbnRhZ2U9IDEwMCkKCkYxMTRfbWNwLkVNPC1tY3BfYW5hbHlzaXMuUE9MWSgiLi9GMTE0L0VtZXJnZW5jZSAuY3N2IiwgcGVyY2VudGFnZT0gMTAwKQpGMTE0X21jcC5EUlk8LW1jcF9hbmFseXNpcy5QT0xZKCIuL0YxMTQvRHJ5IC5jc3YiLCBwZXJjZW50YWdlPSAxMDApCkYxMTRfbWNwLk1PTjwtbWNwX2FuYWx5c2lzLlBPTFkoIi4vRjExNC9Nb25zb29uIC5jc3YiLCBwZXJjZW50YWdlPSAxMDApCkYxMTRfbWNwLlBNPC1tY3BfYW5hbHlzaXMuUE9MWSgiLi9GMTE0L1Bvc3RfTW9uc29vbiAuY3N2IiwgcGVyY2VudGFnZT0gMTAwKQoKRjEzN19tY3AuRU08LW1jcF9hbmFseXNpcy5QT0xZKCIuL0YxMzcvRW1lcmdlbmNlIC5jc3YiLCBwZXJjZW50YWdlPSAxMDApCkYxMzdfbWNwLkRSWTwtbWNwX2FuYWx5c2lzLlBPTFkoIi4vRjEzNy9EcnkgLmNzdiIsIHBlcmNlbnRhZ2U9IDEwMCkKRjEzN19tY3AuTU9OPC1tY3BfYW5hbHlzaXMuUE9MWSgiLi9GMTM3L01vbnNvb24gLmNzdiIsIHBlcmNlbnRhZ2U9IDEwMCkKRjEzN19tY3AuUE08LW1jcF9hbmFseXNpcy5QT0xZKCIuL0YxMzcvUG9zdF9Nb25zb29uIC5jc3YiLCBwZXJjZW50YWdlPSAxMDApCgpGMTQ3X21jcC5FTTwtbWNwX2FuYWx5c2lzLlBPTFkoIi4vRjE0Ny9FbWVyZ2VuY2UgLmNzdiIsIHBlcmNlbnRhZ2U9IDEwMCkKRjE0N19tY3AuRFJZPC1tY3BfYW5hbHlzaXMuUE9MWSgiLi9GMTQ3L0RyeSAuY3N2IiwgcGVyY2VudGFnZT0gMTAwKQpGMTQ3X21jcC5NT048LW1jcF9hbmFseXNpcy5QT0xZKCIuL0YxNDcvTW9uc29vbiAuY3N2IiwgcGVyY2VudGFnZT0gMTAwKQpGMTQ3X21jcC5QTTwtbWNwX2FuYWx5c2lzLlBPTFkoIi4vRjE0Ny9Qb3N0X01vbnNvb24gLmNzdiIsIHBlcmNlbnRhZ2U9IDEwMCkKCkYyNTJfbWNwLkVNPC1tY3BfYW5hbHlzaXMuUE9MWSgiLi9GMjUyL0VtZXJnZW5jZSAuY3N2IiwgcGVyY2VudGFnZT0gMTAwKQpGMjUyX21jcC5EUlk8LW1jcF9hbmFseXNpcy5QT0xZKCIuL0YyNTIvRHJ5IC5jc3YiLCBwZXJjZW50YWdlPSAxMDApCkYyNTJfbWNwLk1PTjwtbWNwX2FuYWx5c2lzLlBPTFkoIi4vRjI1Mi9Nb25zb29uIC5jc3YiLCBwZXJjZW50YWdlPSAxMDApCkYyNTJfbWNwLlBNPC1tY3BfYW5hbHlzaXMuUE9MWSgiLi9GMjUyL1Bvc3RfTW9uc29vbiAuY3N2IiwgcGVyY2VudGFnZT0gMTAwKQoKRjM2X21jcC5FTTwtbWNwX2FuYWx5c2lzLlBPTFkoIi4vRjM2L0VtZXJnZW5jZSAuY3N2IiwgcGVyY2VudGFnZT0gMTAwKQpGMzZfbWNwLkRSWTwtbWNwX2FuYWx5c2lzLlBPTFkoIi4vRjM2L0RyeSAuY3N2IiwgcGVyY2VudGFnZT0gMTAwKQpGMzZfbWNwLk1PTjwtbWNwX2FuYWx5c2lzLlBPTFkoIi4vRjM2L01vbnNvb24gLmNzdiIsIHBlcmNlbnRhZ2U9IDEwMCkKRjM2X21jcC5QTTwtbWNwX2FuYWx5c2lzLlBPTFkoIi4vRjM2L1Bvc3RfTW9uc29vbiAuY3N2IiwgcGVyY2VudGFnZT0gMTAwKQoKRjY2X21jcC5FTTwtbWNwX2FuYWx5c2lzLlBPTFkoIi4vRjY2L0VtZXJnZW5jZSAuY3N2IiwgcGVyY2VudGFnZT0gMTAwKQpGNjZfbWNwLkRSWTwtbWNwX2FuYWx5c2lzLlBPTFkoIi4vRjY2L0RyeSAuY3N2IiwgcGVyY2VudGFnZT0gMTAwKQpGNjZfbWNwLk1PTjwtbWNwX2FuYWx5c2lzLlBPTFkoIi4vRjY2L01vbnNvb24gLmNzdiIsIHBlcmNlbnRhZ2U9IDEwMCkKRjY2X21jcC5QTTwtbWNwX2FuYWx5c2lzLlBPTFkoIi4vRjY2L1Bvc3RfTW9uc29vbiAuY3N2IiwgcGVyY2VudGFnZT0gMTAwKQoKIyMgRm9ydGlmeSBtY3AgcG9seWdvbnMgZm9yIGdncGxvdDIgKlNFQVNPTio6Ck0yMTVfbWNwLkVNVCA8LSBmb3J0aWZ5KE0yMTVfbWNwLkVNLCByZWdpb24gPSAiaWQiKQpNMjE1X21jcC5EUllUIDwtIGZvcnRpZnkoTTIxNV9tY3AuRFJZLCByZWdpb24gPSAiaWQiKQpNMjE1X21jcC5NT05UIDwtIGZvcnRpZnkoTTIxNV9tY3AuTU9OLCByZWdpb24gPSAiaWQiKQoKTTExMl9tY3AuRFJZVCA8LSBmb3J0aWZ5KE0xMTJfbWNwLkRSWSwgcmVnaW9uID0gImlkIikKTTExMl9tY3AuTU9OVCA8LSBmb3J0aWZ5KE0xMTJfbWNwLk1PTiwgcmVnaW9uID0gImlkIikKTTExMl9tY3AuUE1UIDwtIGZvcnRpZnkoTTExMl9tY3AuUE0sIHJlZ2lvbiA9ICJpZCIpCgpNMTE5X21jcC5EUllUIDwtIGZvcnRpZnkoTTExOV9tY3AuRFJZLCByZWdpb24gPSAiaWQiKQpNMTE5X21jcC5NT05UIDwtIGZvcnRpZnkoTTExOV9tY3AuTU9OLCByZWdpb24gPSAiaWQiKQpNMTE5X21jcC5QTVQgPC0gZm9ydGlmeShNMTE5X21jcC5QTSwgcmVnaW9uID0gImlkIikKCkYxMTRfbWNwLkVNVCA8LSBmb3J0aWZ5KEYxMTRfbWNwLkVNLCByZWdpb24gPSAiaWQiKQpGMTE0X21jcC5EUllUIDwtIGZvcnRpZnkoRjExNF9tY3AuRFJZLCByZWdpb24gPSAiaWQiKQpGMTE0X21jcC5NT05UIDwtIGZvcnRpZnkoRjExNF9tY3AuTU9OLCByZWdpb24gPSAiaWQiKQpGMTE0X21jcC5QTVQgPC0gZm9ydGlmeShGMTE0X21jcC5QTSwgcmVnaW9uID0gImlkIikKCkYxMzdfbWNwLkVNVCA8LSBmb3J0aWZ5KEYxMzdfbWNwLkVNLCByZWdpb24gPSAiaWQiKQpGMTM3X21jcC5EUllUIDwtIGZvcnRpZnkoRjEzN19tY3AuRFJZLCByZWdpb24gPSAiaWQiKQpGMTM3X21jcC5NT05UIDwtIGZvcnRpZnkoRjEzN19tY3AuTU9OLCByZWdpb24gPSAiaWQiKQpGMTM3X21jcC5QTVQgPC0gZm9ydGlmeShGMTM3X21jcC5QTSwgcmVnaW9uID0gImlkIikKCkYxNDdfbWNwLkVNVCA8LSBmb3J0aWZ5KEYxNDdfbWNwLkVNLCByZWdpb24gPSAiaWQiKQpGMTQ3X21jcC5EUllUIDwtIGZvcnRpZnkoRjE0N19tY3AuRFJZLCByZWdpb24gPSAiaWQiKQpGMTQ3X21jcC5NT05UIDwtIGZvcnRpZnkoRjE0N19tY3AuTU9OLCByZWdpb24gPSAiaWQiKQpGMTQ3X21jcC5QTVQgPC0gZm9ydGlmeShGMTQ3X21jcC5QTSwgcmVnaW9uID0gImlkIikKCkYyNTJfbWNwLkVNVCA8LSBmb3J0aWZ5KEYyNTJfbWNwLkVNLCByZWdpb24gPSAiaWQiKQpGMjUyX21jcC5EUllUIDwtIGZvcnRpZnkoRjI1Ml9tY3AuRFJZLCByZWdpb24gPSAiaWQiKQpGMjUyX21jcC5NT05UIDwtIGZvcnRpZnkoRjI1Ml9tY3AuTU9OLCByZWdpb24gPSAiaWQiKQpGMjUyX21jcC5QTVQgPC0gZm9ydGlmeShGMjUyX21jcC5QTSwgcmVnaW9uID0gImlkIikKCkYzNl9tY3AuRU1UIDwtIGZvcnRpZnkoRjM2X21jcC5FTSwgcmVnaW9uID0gImlkIikKRjM2X21jcC5EUllUIDwtIGZvcnRpZnkoRjM2X21jcC5EUlksIHJlZ2lvbiA9ICJpZCIpCkYzNl9tY3AuTU9OVCA8LSBmb3J0aWZ5KEYzNl9tY3AuTU9OLCByZWdpb24gPSAiaWQiKQpGMzZfbWNwLlBNVCA8LSBmb3J0aWZ5KEYzNl9tY3AuUE0sIHJlZ2lvbiA9ICJpZCIpCgpGNjZfbWNwLkVNVCA8LSBmb3J0aWZ5KEY2Nl9tY3AuRU0sIHJlZ2lvbiA9ICJpZCIpCkY2Nl9tY3AuRFJZVCA8LSBmb3J0aWZ5KEY2Nl9tY3AuRFJZLCByZWdpb24gPSAiaWQiKQpGNjZfbWNwLk1PTlQgPC0gZm9ydGlmeShGNjZfbWNwLk1PTiwgcmVnaW9uID0gImlkIikKRjY2X21jcC5QTVQgPC0gZm9ydGlmeShGNjZfbWNwLlBNLCByZWdpb24gPSAiaWQiKQoKbWNwLnNoaWZ0LlRFU1Q1IDwtIGdncGxvdCgpICsKICBnZW9tX3BvbHlnb24oZGF0YT1GMTE0X21jcC5FTVQsIGFlcyh4PUYxMTRfbWNwLkVNVCRsb25nLCB5PUYxMTRfbWNwLkVNVCRsYXQpLAogICAgICAgICAgICAgICBhbHBoYT0wLjEsY29sb3VyPSJibHVlIixsaW5ldHlwZT0yKSArCiAgZ2VvbV9wb2x5Z29uKGRhdGE9RjExNF9tY3AuRFJZVCwgYWVzKHg9RjExNF9tY3AuRFJZVCRsb25nLCB5PUYxMTRfbWNwLkRSWVQkbGF0KSwKICAgICAgICAgICAgICAgYWxwaGE9MC4xLGNvbG91cj0icmVkIixsaW5ldHlwZT0zKSArCiAgZ2VvbV9wb2x5Z29uKGRhdGE9RjExNF9tY3AuTU9OVCwgYWVzKHg9RjExNF9tY3AuTU9OVCRsb25nLCB5PUYxMTRfbWNwLk1PTlQkbGF0KSwKICAgICAgICAgICAgICAgYWxwaGE9MC4xLGNvbG91cj0iZ3JlZW4iLGxpbmV0eXBlPTQpICsKICBnZW9tX3BvbHlnb24oZGF0YT1GMTE0X21jcC5QTVQsIGFlcyh4PUYxMTRfbWNwLlBNVCRsb25nLCB5PUYxMTRfbWNwLlBNVCRsYXQpLAogICAgICAgICAgICAgICBhbHBoYT0wLjEsY29sb3VyPSJibGFjayIsbGluZXR5cGU9NSkgKwogIGdlb21fcG9seWdvbihkYXRhPUYxMzdfbWNwLkVNVCwgYWVzKHg9RjEzN19tY3AuRU1UJGxvbmcsIHk9RjEzN19tY3AuRU1UJGxhdCksCiAgICAgICAgICAgICAgIGFscGhhPTAuMSxjb2xvdXI9ImJsdWUiLGxpbmV0eXBlPTIpICsKICBnZW9tX3BvbHlnb24oZGF0YT1GMTM3X21jcC5EUllULCBhZXMoeD1GMTM3X21jcC5EUllUJGxvbmcsIHk9RjEzN19tY3AuRFJZVCRsYXQpLAogICAgICAgICAgICAgICBhbHBoYT0wLjEsY29sb3VyPSJyZWQiLGxpbmV0eXBlPTMpICsKICBnZW9tX3BvbHlnb24oZGF0YT1GMTM3X21jcC5NT05ULCBhZXMoeD1GMTM3X21jcC5NT05UJGxvbmcsIHk9RjEzN19tY3AuTU9OVCRsYXQpLAogICAgICAgICAgICAgICBhbHBoYT0wLjEsY29sb3VyPSJncmVlbiIsbGluZXR5cGU9NCkgKwogIGdlb21fcG9seWdvbihkYXRhPUYxMzdfbWNwLlBNVCwgYWVzKHg9RjEzN19tY3AuUE1UJGxvbmcsIHk9RjEzN19tY3AuUE1UJGxhdCksCiAgICAgICAgICAgICAgIGFscGhhPTAuMSxjb2xvdXI9ImJsYWNrIixsaW5ldHlwZT01KSArCiAgZ2VvbV9wb2x5Z29uKGRhdGE9RjE0N19tY3AuRU1ULCBhZXMoeD1GMTQ3X21jcC5FTVQkbG9uZywgeT1GMTQ3X21jcC5FTVQkbGF0KSwKICAgICAgICAgICAgICAgYWxwaGE9MC4xLGNvbG91cj0iYmx1ZSIsbGluZXR5cGU9MikgKwogIGdlb21fcG9seWdvbihkYXRhPUYxNDdfbWNwLkRSWVQsIGFlcyh4PUYxNDdfbWNwLkRSWVQkbG9uZywgeT1GMTQ3X21jcC5EUllUJGxhdCksCiAgICAgICAgICAgICAgIGFscGhhPTAuMSxjb2xvdXI9InJlZCIsbGluZXR5cGU9MykgKwogIGdlb21fcG9seWdvbihkYXRhPUYxNDdfbWNwLk1PTlQsIGFlcyh4PUYxNDdfbWNwLk1PTlQkbG9uZywgeT1GMTQ3X21jcC5NT05UJGxhdCksCiAgICAgICAgICAgICAgIGFscGhhPTAuMSxjb2xvdXI9ImdyZWVuIixsaW5ldHlwZT00KSArCiAgZ2VvbV9wb2x5Z29uKGRhdGE9RjE0N19tY3AuUE1ULCBhZXMoeD1GMTQ3X21jcC5QTVQkbG9uZywgeT1GMTQ3X21jcC5QTVQkbGF0KSwKICAgICAgICAgICAgICAgYWxwaGE9MC4xLGNvbG91cj0iYmxhY2siLGxpbmV0eXBlPTUpICsKICAjIGdlb21fcG9seWdvbihkYXRhPUYyNTJfbWNwLkVNVCwgYWVzKHg9RjI1Ml9tY3AuRU1UJGxvbmcsIHk9RjI1Ml9tY3AuRU1UJGxhdCksCiAgIyAgICAgICAgICAgICAgYWxwaGE9MC4xLGNvbG91cj0iYmxhY2siLGxpbmV0eXBlPTIpICsKICAjIGdlb21fcG9seWdvbihkYXRhPUYyNTJfbWNwLkRSWVQsIGFlcyh4PUYyNTJfbWNwLkRSWVQkbG9uZywgeT1GMjUyX21jcC5EUllUJGxhdCksCiAgIyAgICAgICAgICAgICAgYWxwaGE9MC4xLGNvbG91cj0iYmxhY2siLGxpbmV0eXBlPTMpICsKICAjIGdlb21fcG9seWdvbihkYXRhPUYyNTJfbWNwLk1PTlQsIGFlcyh4PUYyNTJfbWNwLk1PTlQkbG9uZywgeT1GMjUyX21jcC5NT05UJGxhdCksCiAgIyAgICAgICAgICAgICAgYWxwaGE9MC4xLGNvbG91cj0iYmxhY2siLGxpbmV0eXBlPTQpICsKICAjIGdlb21fcG9seWdvbihkYXRhPUYyNTJfbWNwLlBNVCwgYWVzKHg9RjI1Ml9tY3AuUE1UJGxvbmcsIHk9RjI1Ml9tY3AuUE1UJGxhdCksCiAgIyAgICAgICAgICAgICAgYWxwaGE9MC4xLGNvbG91cj0iYmxhY2siLGxpbmV0eXBlPTUpICsKICBnZW9tX3BvbHlnb24oZGF0YT1GMzZfbWNwLkVNVCwgYWVzKHg9RjM2X21jcC5FTVQkbG9uZywgeT1GMzZfbWNwLkVNVCRsYXQpLAogICAgICAgICAgICAgICBhbHBoYT0wLjEsY29sb3VyPSJibHVlIixsaW5ldHlwZT0yKSArCiAgZ2VvbV9wb2x5Z29uKGRhdGE9RjM2X21jcC5EUllULCBhZXMoeD1GMzZfbWNwLkRSWVQkbG9uZywgeT1GMzZfbWNwLkRSWVQkbGF0KSwKICAgICAgICAgICAgICAgYWxwaGE9MC4xLGNvbG91cj0icmVkIixsaW5ldHlwZT0zKSArCiAgZ2VvbV9wb2x5Z29uKGRhdGE9RjM2X21jcC5NT05ULCBhZXMoeD1GMzZfbWNwLk1PTlQkbG9uZywgeT1GMzZfbWNwLk1PTlQkbGF0KSwKICAgICAgICAgICAgICAgYWxwaGE9MC4xLGNvbG91cj0iZ3JlZW4iLGxpbmV0eXBlPTQpICsKICBnZW9tX3BvbHlnb24oZGF0YT1GMzZfbWNwLlBNVCwgYWVzKHg9RjM2X21jcC5QTVQkbG9uZywgeT1GMzZfbWNwLlBNVCRsYXQpLAogICAgICAgICAgICAgICBhbHBoYT0wLjEsY29sb3VyPSJibGFjayIsbGluZXR5cGU9NSkgKwogIGdlb21fcG9seWdvbihkYXRhPUY2Nl9tY3AuRU1ULCBhZXMoeD1GNjZfbWNwLkVNVCRsb25nLCB5PUY2Nl9tY3AuRU1UJGxhdCksCiAgICAgICAgICAgICAgIGFscGhhPTAuMSxjb2xvdXI9ImJsdWUiLGxpbmV0eXBlPTIpICsKICBnZW9tX3BvbHlnb24oZGF0YT1GNjZfbWNwLkRSWVQsIGFlcyh4PUY2Nl9tY3AuRFJZVCRsb25nLCB5PUY2Nl9tY3AuRFJZVCRsYXQpLAogICAgICAgICAgICAgICBhbHBoYT0wLjEsY29sb3VyPSJyZWQiLGxpbmV0eXBlPTMpICsKICBnZW9tX3BvbHlnb24oZGF0YT1GNjZfbWNwLk1PTlQsIGFlcyh4PUY2Nl9tY3AuTU9OVCRsb25nLCB5PUY2Nl9tY3AuTU9OVCRsYXQpLAogICAgICAgICAgICAgICBhbHBoYT0wLjEsY29sb3VyPSJncmVlbiIsbGluZXR5cGU9NCkgKwogIGdlb21fcG9seWdvbihkYXRhPUY2Nl9tY3AuUE1ULCBhZXMoeD1GNjZfbWNwLlBNVCRsb25nLCB5PUY2Nl9tY3AuUE1UJGxhdCksCiAgICAgICAgICAgICAgIGFscGhhPTAuMSxjb2xvdXI9ImJsYWNrIixsaW5ldHlwZT01KSArCiAgdGhlbWVfYncoKSArCiAgbGFicyh4PSJFYXN0aW5nIChtKSIsIHk9Ik5vcnRoaW5nIChtKSIpICsKICBsYWJzKGNhcHRpb24gPSAiRmlndXJlIDYgfCAgU0Mgc2Vhc29uYWwgaG9tZSByYW5nZSBzaGlmdHMgb2YgZml2ZSBsaXphcmRzLiBBbGwgc2Vhc29uYWwgcG9seWdvbnMgc3RheSByZWxhdGl2ZWx5IHN0YWJsZSB3aXRoIFxuIGNvbnNpZGVyYWJsZSBvdmVybGFwIGFuZCB3aXRob3V0IGFueSBtYWpvciBzaGlmdHMuIikrCiAgdGhlbWUocGxvdC5jYXB0aW9uID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMCxsaW5laGVpZ2h0ID0gMC45KSkrCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIiwgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYWNlID0gImJvbGQiLCBoanVzdCA9IDAuNSkpCgptY3Auc2hpZnQuVEVTVDUKYGBgCgoKCgpUQUJMRSBncm91cCBtZWFucyAgb2Ygc2Vhc29uYWwgaG9tZSByYW5nZXMgYmV0d2VlbiB0aGUgIHR3byAgcG9wdWxhdGlvbnMgYXZlcmFnZWQgYWNyb3NzIHNleApgYGB7cn0Kc2Vhc29uYWw8LXJlYWQuY3N2KCJTQ19TZWFzb25hbF9EYXRhLmNzdiIpCgpsaWJyYXJ5KFJtaXNjKQoKU0VBU19HUlBfTWVhbnMgPC0gc3VtbWFyeVNFKHNlYXNvbmFsLCBtZWFzdXJldmFyPSJIb21lX1JhbmdlXzEwMG1jcCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cHZhcnM9YygiRW52aXJvbm1lbnQiLCJTZWFzb24iKSwgbmEucm0gPSBUUlVFKQoKIyBTRUFTX0dSUF9NZWFucwprYWJsZShTRUFTX0dSUF9NZWFucywgZm9ybWF0ID0gInBhbmRvYyIsIGNhcHRpb24gPSAnVGFibGUgNiB8IEdyb3VwIG1lYW5zIG9mIHNlYXNvbmFsIGhvbWUgcmFuZ2VzIGJldHdlZW4gU3RvbmUgQ2FueW9uIChzdWJzaWRpemVkKSBhbmQgT3dsIEhlYWQgQnV0dGVzIChub24tc3Vic2lkaXplZCkuIFRoZXNlIG1lYW5zIGFyZSBhdmVyYWdlZCBhY3Jvc3Mgc2V4LicpCmBgYAoKCgoKUk0tQU5PVkEgZm9yIHNlYXNvbmFsIGhvbWUgcmFuZ2VzIGJldHdlZW4gZW52aXJvbm1lbnRzCmBgYHtyfQpsaWJyYXJ5KGxtZTQpCmxpYnJhcnkocmVhZHIpCmxpYnJhcnkobG1lclRlc3QpCiMgc2Vhc29uYWw8LXJlYWQuY3N2KCJTQ19TZWFzb25hbF9EYXRhLmNzdiIpCgpSTS5tb2QuU2Vhc29uIDwtIGxtZXIoSG9tZV9SYW5nZV8xMDBtY3B+RW52aXJvbm1lbnQrU2Vhc29uK1NleCtOK0Vudmlyb25tZW50KlNlYXNvbisoMXxHaWxhKSwgCiAgICAgICAgICAgICAgICAgICAgICBkYXRhPXNlYXNvbmFsKQpzdW1tYXJ5KFJNLm1vZC5TZWFzb24pCmBgYAoKCkFOT1ZBIHRhYmxlIG9mIHNlYXNvbmFsIEhScyBiZXR3ZWVuIGVudnMuCmBgYHtyfQphbm92YShSTS5tb2QuU2Vhc29uKQpgYGAKCgoKClRBQkxFIG9mIHNlYXNvbmFsIGhvbWUgcmFuZ2VzIGJ5IHNleCBiZXR3ZWVuIHRoZSB0d28gcG9wdWxhdGlvbnMKYGBge3J9ClNFQVNfR1JQX1RFU1QgPC0gc3VtbWFyeVNFKHNlYXNvbmFsLCBtZWFzdXJldmFyPSJIb21lX1JhbmdlXzEwMG1jcCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwdmFycz1jKCJFbnZpcm9ubWVudCIsIlNlYXNvbiIsIlNleCIpLCBuYS5ybSA9IFRSVUUpCgojIFNFQVNfR1JQX01lYW5zCmthYmxlKFNFQVNfR1JQX1RFU1QsIGZvcm1hdCA9ICJwYW5kb2MiLCBjYXB0aW9uID0gJ1RhYmxlIDcgfCBTZWFzb25hbCBob21lIHJhbmdlIG1lYW5zIGJldHdlZW4gU3RvbmUgQ2FueW9uIChzdWJzaWRpemVkKSBhbmQgT3dsIEhlYWQgQnV0dGVzIChub24tc3Vic2lkaXplZCkgcG9wdWF0aW9ucyBmb3IgbWFsZXMgYW5kIGZlbWFsZXMuIFRoZXNlIGFyZSByYXcgbWVhbnMgYmVmb3JlIGJlaW5nIGFkanVzdGVkIGZvciBlbnZpcm9ubWVudCwgc2Vhc29uLCBzZXgsIGFuZCBzYW1wbGUgc2l6ZS4nKQpgYGAKCgoKCmZpZ3VyZXMgZm9yIHJhdyBzZWFzb25hbCBob21lIHJhbmdlcyBiZXR3ZWVuIHRoZSB0d28gcG9wdWxhdGlvbnMKYGBge3J9CnBkIDwtIHBvc2l0aW9uX2RvZGdlKDAuMykgIyBtb3ZlIHRoZW0gLjA1IHRvIHRoZSBsZWZ0IGFuZCByaWdodCAoJ2RvZGdlcycpCgojIHJlbGV2ZWwgZmFjdG9yIHNlYXNvbjoKU0VBU19HUlBfVEVTVCRTZWFzb248LXJlbGV2ZWwoU0VBU19HUlBfVEVTVCRTZWFzb24sIkVtZXJnZW5jZSIpCgojIE5ldyBmYWNldCBsYWJlbCBuYW1lcyBmb3Igc2Vhc29ucwojIHNlYXNvbi5sYWJzIDwtIGMoIkRyeSIsICJFbWVyZ2VuY2UiLCAiTW9uc29vbiIsICJQb3N0IE1vbnNvb24iKQojIG5hbWVzKHNlYXNvbi5sYWJzKSA8LSBjKCJEcnkiLCAiRW1lcmdlbmNlIiwgIk1vbnNvb24iLCAiUG9zdF9Nb25zb29uIikKCnNlYXNvbi5sYWJzIDwtIGMoIkVtZXJnZW5jZSIsICJEcnkiLCAiTW9uc29vbiIsICJQb3N0IE1vbnNvb24iKQpuYW1lcyhzZWFzb24ubGFicykgPC0gYygiRW1lcmdlbmNlIiwgIkRyeSIsICJNb25zb29uIiwgIlBvc3RfTW9uc29vbiIpCgojIyBURVNUIDMKcmF3LnNlYXNvbmFsPC1nZ3Bsb3QoU0VBU19HUlBfVEVTVCxhZXMoeD1FbnZpcm9ubWVudCwgeT1Ib21lX1JhbmdlXzEwMG1jcCwgc2hhcGU9U2V4KSkgKyAKICBnZW9tX3BvaW50KGFlcyhzaGFwZT1TZXgpLCBzaXplID0gNCwgcG9zaXRpb249cGQpICsKICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluPUhvbWVfUmFuZ2VfMTAwbWNwLXNlLCB5bWF4PUhvbWVfUmFuZ2VfMTAwbWNwK3NlKSwgcG9zaXRpb24gPSBwZCwKICAgICAgICAgICAgICAgIHdpZHRoPTAuMywgc2l6ZT0wLjUsIGx0eT0xKSArCiAgZmFjZXRfZ3JpZCh+U2Vhc29uLCBsYWJlbGxlcj1sYWJlbGxlcihTZWFzb249c2Vhc29uLmxhYnMpKSArCiAgIHRoZW1lX2J3KCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9IGMoLjEwLC44NSksIGxlZ2VuZC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGNvbG91ciA9ICJibGFjayIpLAogICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQobGluZWhlaWdodD0xLjUsIGZhY2U9ImJvbGQiLCBzaXplPXJlbCgxLjUpLCBoanVzdCA9IDAuNSksCiAgICAgICAgIyBheGlzLnRleHQueCAgPSBlbGVtZW50X3RleHQodmp1c3Q9MC41LCBzaXplPTgpLAogICAgICAgIGF4aXMudGV4dC54PWVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRleHQueSAgPSBlbGVtZW50X3RleHQodmp1c3Q9MC41LCBzaXplPTEyKSwKICAgICAgICBheGlzLnRpdGxlLnkgID0gZWxlbWVudF90ZXh0KHNpemU9MTgpLAogICAgICAgIGF4aXMudGl0bGUueCAgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiwgZmFjZSA9ICJib2xkIiksCiAgICAgICAgYXhpcy50aWNrcy54PWVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemU9MTIpKSArCiAgeGxhYigiIikgKyB5bGFiKCIxMDAlIE1DUCBBcmVhIChoYSkiKSAKCnJhdy5zZWFzb25hbApgYGAKCgoKCkZpZ3VyZXMgQWRqdXN0ZWQgRU1NcyBvZiBzZWFzb25hbCBob21lIHJhbmdlIGJldHdlZW4gdGhlIHR3byBwb3B1bGF0aW9ucwpgYGB7cn0KUk0ubW9kLlNlYXNvbiA8LSBsbWVyKEhvbWVfUmFuZ2VfMTAwbWNwfkVudmlyb25tZW50K1NlYXNvbitTZXgrTitFbnZpcm9ubWVudCpTZWFzb24rKDF8R2lsYSksIGRhdGE9c2Vhc29uYWwpCgojIFJNLm1hcmdpbmFsLnNlYXMgPC0gbHNtZWFucyhSTS5tb2QuU2Vhc29uLAojICAgICAgICAgICAgICAgICAgICAgfiBFbnZpcm9ubWVudCkKIyBSTS5tYXJnaW5hbC5zZWFzCgojIyBDQVRBR09SSVpFIExTTSBHUkFQSCBCWSBTRVggQkVUV0VFTiBFTlZJUk9OTUVOVDoKcmVmUk1fc2Vhc29uIDwtIGxzbWVhbnMoUk0ubW9kLlNlYXNvbiwgc3BlY3MgPSBjKCJFbnZpcm9ubWVudCIsIlNlYXNvbiIsIlNleCIpKQoKIyByZWZSTV9zZXgKcmVmX2RmUk1fc2Vhc29uIDwtIGFzLmRhdGEuZnJhbWUoc3VtbWFyeShyZWZSTV9zZWFzb24pKQpwZF9STSA8LSBwb3NpdGlvbl9kb2RnZSgwLjIpCgojIHJlbGV2ZWwgZmFjdG9yIHNlYXNvbiBmb3IgZ3JhcGhpbmcgcHVycG9zZXM6CnJlZl9kZlJNX3NlYXNvbiRTZWFzb248LXJlbGV2ZWwocmVmX2RmUk1fc2Vhc29uJFNlYXNvbiwiRW1lcmdlbmNlIikKCiMgTmV3IGZhY2V0IGxhYmVsIG5hbWVzIGZvciBzZWFzb25zCiMgc2Vhc29uLmxhYnMgPC0gYygiRHJ5IiwgIkVtZXJnZW5jZSIsICJNb25zb29uIiwgIlBvc3QgTW9uc29vbiIpCiMgbmFtZXMoc2Vhc29uLmxhYnMpIDwtIGMoIkRyeSIsICJFbWVyZ2VuY2UiLCAiTW9uc29vbiIsICJQb3N0X01vbnNvb24iKQoKIyBzZWFzb24ubGFicyA8LSBjKCJFbWVyZ2VuY2UiLCAiRHJ5IiwgIk1vbnNvb24iLCAiUG9zdCBNb25zb29uIikKIyBuYW1lcyhzZWFzb24ubGFicykgPC0gYygiRW1lcmdlbmNlIiwgIkRyeSIsICJNb25zb29uIiwgIlBvc3RfTW9uc29vbiIpCgphZGouc2Vhc29uYWw8LWdncGxvdChyZWZfZGZSTV9zZWFzb24sYWVzKHg9RW52aXJvbm1lbnQsIHk9bHNtZWFuLCBzaGFwZT1TZXgpKSArIAogIGdlb21fcG9pbnQoYWVzKHNoYXBlPVNleCksIHNpemUgPSA0LCBwb3NpdGlvbj1wZCwgc2hvdy5sZWdlbmQ9RkFMU0UpICsKICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzPWMoMSwgMikpICsKICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluPWxzbWVhbi1TRSwgeW1heD1sc21lYW4rU0UpLCBwb3NpdGlvbiA9IHBkLAogICAgICAgICAgICAgICAgd2lkdGg9MC4zLCBzaXplPTAuNSwgbHR5PTEpICsgCiAgZmFjZXRfZ3JpZCh+U2Vhc29uLCBsYWJlbGxlcj1sYWJlbGxlcihTZWFzb249c2Vhc29uLmxhYnMpKSArCiAgdGhlbWVfYncoKSsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSBjKC44NywuODUpLCBsZWdlbmQuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChjb2xvdXIgPSAiYmxhY2siKSwKICAgICAgICBheGlzLnRleHQueCAgPSBlbGVtZW50X3RleHQodmp1c3Q9MC41LCBzaXplPTE4KSwKICAgICAgICBheGlzLnRleHQueSAgPSBlbGVtZW50X3RleHQodmp1c3Q9MC41LCBzaXplPTEyKSwKICAgICAgICBheGlzLnRpdGxlLnkgID0gZWxlbWVudF90ZXh0KHNpemU9MTgpLAogICAgICAgIGF4aXMudGl0bGUueCAgPSBlbGVtZW50X3RleHQoc2l6ZT0xMCksCiAgICAgICAgIyBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIsIGZhY2UgPSAiYm9sZCIpLAogICAgICAgIHN0cmlwLnRleHQgPSBlbGVtZW50X2JsYW5rKCkpICsKICBzY2FsZV94X2Rpc2NyZXRlKGxhYmVscz1jKCJOb24iLCAiU3ViIikpICsKICB4bGFiKCIiKSArIHlsYWIoIjEwMCUgTUNQIEFyZWEgKGhhKSIpCgphZGouc2Vhc29uYWwKYGBgCgoKQ29sbGVjdGl2ZSBncmlkIG9mIHJhdyBhbmQgYWRqdXN0ZWQgc2Vhc29uYWwgaG9tZSByYW5nZXMKYGBge3J9CmdnYXJyYW5nZShyYXcuc2Vhc29uYWwsIGFkai5zZWFzb25hbCwgbGFiZWxzID0gYygiQSIsICJCIiksCiAgICAgICAgICBucm93ID0gMikKYGBgCgoKCgpQb3N0IGhvYyBhbmFseXNlcyBvZiBzZWFzb25hbCBob21lIHJhbmdlcwoKUGFpcndpc2Ugb2YgZWFjaCBzZWFzb24gYmV0d2VlbiBwb3B1bGF0aW9ucywgb3ZlcmFnZWQgb3ZlciBsZXZlbHMgb2Ygc2V4CmBgYHtyfQplbW1fcy50IDwtIGVtbWVhbnMoUk0ubW9kLlNlYXNvbiwgcGFpcndpc2UgfiBFbnZpcm9ubWVudCB8IFNlYXNvbikKZW1tX3MudApgYGAKCkdyYXBoaWNhbCBjb21wYXJpc29ucwpgYGB7cn0KcGxvdChlbW1fcy50LCBjb21wYXJpc29ucyA9IFRSVUUpCmBgYAoKCgoKUGFpcndpc2UgYmV0d2VlbiBzZWFzb25zIHdpdGhpbiBlYWNoIHBvcHVsdGlvbiAKYGBge3J9CmVtbV9zLnQ0IDwtIGVtbWVhbnMoUk0ubW9kLlNlYXNvbiwgcGFpcndpc2UgfiBTZWFzb24gfCBFbnZpcm9ubWVudCkKZW1tX3MudDQKYGBgCgpHcmFwaGljYWwgQ29tcHMKYGBge3J9CnBsb3QoZW1tX3MudDQsIGNvbXBhcmlzb25zID0gVFJVRSkKYGBgCgoKClBhaXJ3aXNlIGJldHdlZW4gc2V4ZXMgb2YgZWFjaCBzZWFzb24gb2YgdGhlICBzdWJzaWRpemVkIHBvcHVsYXRpb24KYGBge3J9CnN1YiA8LSBzdWJzZXQoc2Vhc29uYWwsIEVudmlyb25tZW50ID09ICJzdWJzaWRpemVkIikKClJNLm1vZC5TdWIgPC0gbG1lcihIb21lX1JhbmdlXzEwMG1jcH5TZWFzb24rU2V4K04rU2Vhc29uKlNleCsoMXxHaWxhKSwgZGF0YT1zdWIpCgplbW1fcy50NSA8LSBlbW1lYW5zKFJNLm1vZC5TdWIsIHBhaXJ3aXNlIH4gU2V4IHwgU2Vhc29uKQplbW1fcy50NSAKYGBgCgpHcmFwaGljYWwgQ29tcHMKYGBge3J9CnBsb3QoZW1tX3MudDUsIGNvbXBhcmlzb25zID0gVFJVRSkKYGBgCgoKClBhaXJ3aXNlIGJldHdlZW4gc2V4ZXMgb2YgZWFjaCBzZWFzb24gb2YgdGhlICBub24tc3Vic2lkaXplZCBwb3B1bGF0aW9uCmBgYHtyfQpub25zdWIgPC0gc3Vic2V0KHNlYXNvbmFsLCBFbnZpcm9ubWVudCA9PSAibm9uc3Vic2lkaXplZCIpClZpZXcobm9uc3ViKQpSTS5tb2QuTlN1YiA8LSBsbWVyKEhvbWVfUmFuZ2VfMTAwbWNwflNlYXNvbitTZXgrTitTZWFzb24qU2V4KygxfEdpbGEpLCBkYXRhPW5vbnN1YikKCmVtbV9zLnQ2IDwtIGVtbWVhbnMoUk0ubW9kLk5TdWIsIHBhaXJ3aXNlIH4gU2V4IHwgU2Vhc29uKQplbW1fcy50NiAKYGBgCgpHcmFwaGljYWwgQ29tcHMKYGBge3J9CnBsb3QoZW1tX3MudDYsIGNvbXBhcmlzb25zID0gVFJVRSkKYGBgCgoKCgo=